private void AdjustOutputTypes() { // since MySQL likes to return user variables as strings // we reset the types of the readers internal value objects // this will allow those value objects to parse the string based // return values for (int i = 0; i < FieldCount; i++) { string fieldName = GetName(i); fieldName = fieldName.Remove(0, StoredProcedure.ParameterPrefix.Length + 1); MyCatParameter parameter = command.Parameters.GetParameterFlexible(fieldName, true); IMyCatValue v = MyCatField.GetIMyCatValue(parameter.MyCatDbType); if (v is MyCatBit) { MyCatBit bit = (MyCatBit)v; bit.ReadAsString = true; resultSet.SetValueObject(i, bit); } else { resultSet.SetValueObject(i, v); } } }
public MyCatField[] GetColumns(long count) { MyCatField[] fields = new MyCatField[count]; for (int i = 0; i < count; i++) { fields[i] = new MyCatField(this); } handler.GetColumnsData(fields); return(fields); }
private void GetColumnData(MyCatField field) { stream.Encoding = Encoding; packet = stream.ReadPacket(); field.Encoding = Encoding; field.CatalogName = packet.ReadLenString(); field.DatabaseName = packet.ReadLenString(); field.TableName = packet.ReadLenString(); field.RealTableName = packet.ReadLenString(); field.ColumnName = packet.ReadLenString(); field.OriginalColumnName = packet.ReadLenString(); packet.ReadByte(); field.CharacterSetIndex = packet.ReadInteger(2); field.ColumnLength = packet.ReadInteger(4); MyCatDbType type = (MyCatDbType)packet.ReadByte(); ColumnFlags colFlags; if ((connectionFlags & ClientFlags.LONG_FLAG) != 0) { colFlags = (ColumnFlags)packet.ReadInteger(2); } else { colFlags = (ColumnFlags)packet.ReadByte(); } field.Scale = (byte)packet.ReadByte(); if (packet.HasMoreData) { packet.ReadInteger(2); // reserved } if (type == MyCatDbType.Decimal || type == MyCatDbType.NewDecimal) { field.Precision = (byte)(field.ColumnLength - 2); if ((colFlags & ColumnFlags.UNSIGNED) != 0) { field.Precision++; } } field.SetTypeAndFlags(type, colFlags); }
public IMyCatValue ReadColumnValue(int index, MyCatField field, IMyCatValue valObject) { long length = -1; bool isNull; if (nullMap != null) { isNull = nullMap[index + 2]; } else { length = packet.ReadFieldLength(); isNull = length == -1; } packet.Encoding = field.Encoding; packet.Version = version; return(valObject.ReadValue(packet, length, isNull)); }
private void SetDbType(DbType db_type) { dbType = db_type; switch (dbType) { case DbType.Guid: mySqlDbType = MyCatDbType.Guid; break; case DbType.AnsiString: case DbType.String: mySqlDbType = MyCatDbType.VarChar; break; case DbType.AnsiStringFixedLength: case DbType.StringFixedLength: mySqlDbType = MyCatDbType.String; break; case DbType.Boolean: case DbType.Byte: mySqlDbType = MyCatDbType.UByte; break; case DbType.SByte: mySqlDbType = MyCatDbType.Byte; break; case DbType.Date: mySqlDbType = MyCatDbType.Date; break; case DbType.DateTime: mySqlDbType = MyCatDbType.DateTime; break; case DbType.Time: mySqlDbType = MyCatDbType.Time; break; case DbType.Single: mySqlDbType = MyCatDbType.Float; break; case DbType.Double: mySqlDbType = MyCatDbType.Double; break; case DbType.Int16: mySqlDbType = MyCatDbType.Int16; break; case DbType.UInt16: mySqlDbType = MyCatDbType.UInt16; break; case DbType.Int32: mySqlDbType = MyCatDbType.Int32; break; case DbType.UInt32: mySqlDbType = MyCatDbType.UInt32; break; case DbType.Int64: mySqlDbType = MyCatDbType.Int64; break; case DbType.UInt64: mySqlDbType = MyCatDbType.UInt64; break; case DbType.Decimal: case DbType.Currency: mySqlDbType = MyCatDbType.Decimal; break; case DbType.Object: case DbType.VarNumeric: case DbType.Binary: default: mySqlDbType = MyCatDbType.Blob; break; } if (dbType == DbType.Object) { var value = this.paramValue as byte[]; if (value != null && value.Length == GEOMETRY_LENGTH) { mySqlDbType = MyCatDbType.Geometry; } } ValueObject = MyCatField.GetIMyCatValue(mySqlDbType); }
public IMyCatValue ReadColumnValue(int index, MyCatField field, IMyCatValue value) { return(handler.ReadColumnValue(index, field, value)); }
private void SetMyCatDbType(MyCatDbType mysql_dbtype) { mySqlDbType = mysql_dbtype; ValueObject = MyCatField.GetIMyCatValue(mySqlDbType); SetDbTypeFromMyCatDbType(); }
/// <summary> /// Returns a DataTable that describes the column metadata of the MyCatDataReader. /// </summary> /// <returns></returns> public override DataTable GetSchemaTable() { // Only Results from SQL SELECT Queries // get a DataTable for schema of the result // otherwise, DataTable is null reference if (FieldCount == 0) { return(null); } DataTable dataTableSchema = new DataTable("SchemaTable"); dataTableSchema.Columns.Add("ColumnName", typeof(string)); dataTableSchema.Columns.Add("ColumnOrdinal", typeof(int)); dataTableSchema.Columns.Add("ColumnSize", typeof(int)); dataTableSchema.Columns.Add("NumericPrecision", typeof(int)); dataTableSchema.Columns.Add("NumericScale", typeof(int)); dataTableSchema.Columns.Add("IsUnique", typeof(bool)); dataTableSchema.Columns.Add("IsKey", typeof(bool)); DataColumn dc = dataTableSchema.Columns["IsKey"]; dc.AllowDBNull = true; // IsKey can have a DBNull dataTableSchema.Columns.Add("BaseCatalogName", typeof(string)); dataTableSchema.Columns.Add("BaseColumnName", typeof(string)); dataTableSchema.Columns.Add("BaseSchemaName", typeof(string)); dataTableSchema.Columns.Add("BaseTableName", typeof(string)); dataTableSchema.Columns.Add("DataType", typeof(Type)); dataTableSchema.Columns.Add("AllowDBNull", typeof(bool)); dataTableSchema.Columns.Add("ProviderType", typeof(int)); dataTableSchema.Columns.Add("IsAliased", typeof(bool)); dataTableSchema.Columns.Add("IsExpression", typeof(bool)); dataTableSchema.Columns.Add("IsIdentity", typeof(bool)); dataTableSchema.Columns.Add("IsAutoIncrement", typeof(bool)); dataTableSchema.Columns.Add("IsRowVersion", typeof(bool)); dataTableSchema.Columns.Add("IsHidden", typeof(bool)); dataTableSchema.Columns.Add("IsLong", typeof(bool)); dataTableSchema.Columns.Add("IsReadOnly", typeof(bool)); int ord = 1; for (int i = 0; i < FieldCount; i++) { MyCatField f = resultSet.Fields[i]; DataRow r = dataTableSchema.NewRow(); r["ColumnName"] = f.ColumnName; r["ColumnOrdinal"] = ord++; r["ColumnSize"] = f.IsTextField ? f.ColumnLength / f.MaxLength : f.ColumnLength; int prec = f.Precision; int pscale = f.Scale; if (prec != -1) { r["NumericPrecision"] = (short)prec; } if (pscale != -1) { r["NumericScale"] = (short)pscale; } r["DataType"] = GetFieldType(i); r["ProviderType"] = (int)f.Type; r["IsLong"] = f.IsBlob && f.ColumnLength > 255; r["AllowDBNull"] = f.AllowsNull; r["IsReadOnly"] = false; r["IsRowVersion"] = false; r["IsUnique"] = false; r["IsKey"] = f.IsPrimaryKey; r["IsAutoIncrement"] = f.IsAutoIncrement; r["BaseSchemaName"] = f.DatabaseName; r["BaseCatalogName"] = null; r["BaseTableName"] = f.RealTableName; r["BaseColumnName"] = f.OriginalColumnName; dataTableSchema.Rows.Add(r); } return(dataTableSchema); }