public void Add(TdsDataColumnCollection columns) { foreach (TdsDataColumn col in columns) { Add(col); } }
protected override TdsDataColumnCollection ProcessColumnInfo () { byte precision; byte scale; int totalLength = Comm.GetTdsShort (); int bytesRead = 0; TdsDataColumnCollection result = new TdsDataColumnCollection (); while (bytesRead < totalLength) { scale = 0; precision = 0; int bufLength = -1; byte[] flagData = new byte[4]; for (int i = 0; i < 4; i += 1) { flagData[i] = Comm.GetByte (); bytesRead += 1; } bool nullable = (flagData[2] & 0x01) > 0; bool caseSensitive = (flagData[2] & 0x02) > 0; bool writable = (flagData[2] & 0x0c) > 0; bool autoIncrement = (flagData[2] & 0x10) > 0; string tableName = String.Empty; TdsColumnType columnType = (TdsColumnType) Comm.GetByte (); bytesRead += 1; if (columnType == TdsColumnType.Text || columnType == TdsColumnType.Image) { Comm.Skip (4); bytesRead += 4; int tableNameLength = Comm.GetTdsShort (); bytesRead += 2; tableName = Comm.GetString (tableNameLength); bytesRead += tableNameLength; bufLength = 2 << 31 - 1; } else if (columnType == TdsColumnType.Decimal || columnType == TdsColumnType.Numeric) { bufLength = Comm.GetByte (); bytesRead += 1; precision = Comm.GetByte (); bytesRead += 1; scale = Comm.GetByte (); bytesRead += 1; } else if (IsFixedSizeColumn (columnType)) bufLength = LookupBufferSize (columnType); else { bufLength = (int) Comm.GetByte () & 0xff; bytesRead += 1; } int index = result.Add (new TdsDataColumn ()); result[index]["NumericPrecision"] = precision; result[index]["NumericScale"] = scale; result[index]["ColumnSize"] = bufLength; result[index]["ColumnName"] = ColumnNames[index]; result[index]["ColumnType"] = columnType; result[index]["BaseTableName"] = tableName; result[index]["AllowDBNull"] = nullable; result[index]["IsReadOnly"] = !writable; } return result; }
public void Add (TdsDataColumnCollection columns) { foreach (TdsDataColumn col in columns) Add (col); }
protected override TdsDataColumnCollection ProcessColumnInfo () { TdsDataColumnCollection result = new TdsDataColumnCollection (); int numColumns = Comm.GetTdsShort (); for (int i = 0; i < numColumns; i += 1) { byte[] flagData = new byte[4]; for (int j = 0; j < 4; j += 1) flagData[j] = Comm.GetByte (); bool nullable = (flagData[2] & 0x01) > 0; bool caseSensitive = (flagData[2] & 0x02) > 0; bool writable = (flagData[2] & 0x0c) > 0; bool autoIncrement = (flagData[2] & 0x10) > 0; bool isIdentity = (flagData[2] & 0x10) > 0; TdsColumnType columnType = (TdsColumnType) (Comm.GetByte () & 0xff); if ((byte) columnType == 0xef) columnType = TdsColumnType.NChar; byte xColumnType = 0; if (IsLargeType (columnType)) { xColumnType = (byte) columnType; if (columnType != TdsColumnType.NChar) columnType -= 128; } int columnSize; string tableName = null; if (IsBlobType (columnType)) { columnSize = Comm.GetTdsInt (); tableName = Comm.GetString (Comm.GetTdsShort ()); } else if (IsFixedSizeColumn (columnType)) columnSize = LookupBufferSize (columnType); else if (IsLargeType ((TdsColumnType) xColumnType)) columnSize = Comm.GetTdsShort (); else columnSize = Comm.GetByte () & 0xff; byte precision = 0; byte scale = 0; switch (columnType) { case TdsColumnType.NText: case TdsColumnType.NChar: case TdsColumnType.NVarChar: columnSize /= 2; break; case TdsColumnType.Decimal: case TdsColumnType.Numeric: precision = Comm.GetByte (); scale = Comm.GetByte (); break; } string columnName = Comm.GetString (Comm.GetByte ()); int index = result.Add (new TdsDataColumn ()); result[index]["AllowDBNull"] = nullable; result[index]["ColumnName"] = columnName; result[index]["ColumnSize"] = columnSize; result[index]["ColumnType"] = columnType; result[index]["IsIdentity"] = isIdentity; result[index]["IsReadOnly"] = !writable; result[index]["NumericPrecision"] = precision; result[index]["NumericScale"] = scale; result[index]["BaseTableName"] = tableName; } return result; }
public Tds (string dataSource, int port, int packetSize, int timeout, int lifeTime, TdsVersion tdsVersion) { this.tdsVersion = tdsVersion; this.packetSize = packetSize; this.dataSource = dataSource; this.columns = new TdsDataColumnCollection (); this.lifeTime = lifeTime; InitComm (port, timeout); }
protected virtual TdsPacketSubType ProcessSubPacket () { TdsPacketSubType subType = (TdsPacketSubType) comm.GetByte (); switch (subType) { case TdsPacketSubType.Dynamic2: comm.Skip (comm.GetTdsInt ()); break; case TdsPacketSubType.AltName: case TdsPacketSubType.AltFormat: case TdsPacketSubType.Capability: case TdsPacketSubType.ParamFormat: comm.Skip (comm.GetTdsShort ()); break; case TdsPacketSubType.Dynamic: ProcessDynamic (); break; case TdsPacketSubType.EnvironmentChange: ProcessEnvironmentChange (); break; case TdsPacketSubType.Info: // TDS 4.2/7.0 case TdsPacketSubType.EED: // TDS 5.0 case TdsPacketSubType.Error: // TDS 4.2/7.0 ProcessMessage (subType); break; case TdsPacketSubType.Param: ProcessOutputParam (); break; case TdsPacketSubType.LoginAck: ProcessLoginAck (); break; case TdsPacketSubType.Authentication: // TDS 7.0 ProcessAuthentication (); break; case TdsPacketSubType.ReturnStatus : Comm.Skip (4); break; case TdsPacketSubType.ProcId: Comm.Skip (8); break; case TdsPacketSubType.Done: case TdsPacketSubType.DoneProc: case TdsPacketSubType.DoneInProc: ProcessEndToken (subType); break; case TdsPacketSubType.ColumnName: Comm.Skip (8); ProcessColumnNames (); break; case TdsPacketSubType.ColumnInfo: // TDS 4.2 case TdsPacketSubType.ColumnMetadata: // TDS 7.0 case TdsPacketSubType.RowFormat: // TDS 5.0 columns = ProcessColumnInfo (); break; case TdsPacketSubType.ColumnDetail: ProcessColumnDetail (); break; case TdsPacketSubType.TableName: ProcessTableName (); break; case TdsPacketSubType.ColumnOrder: comm.Skip (comm.GetTdsShort ()); break; case TdsPacketSubType.Control: comm.Skip (comm.GetTdsShort ()); break; case TdsPacketSubType.Row: LoadRow (); break; } return subType; }
protected override TdsDataColumnCollection ProcessColumnInfo () { TdsDataColumnCollection result = new TdsDataColumnCollection (); int totalLength = Comm.GetTdsShort (); int count = Comm.GetTdsShort (); for (int i = 0; i < count; i += 1) { string columnName = Comm.GetString (Comm.GetByte ()); int status = Comm.GetByte (); bool hidden = (status & 0x01) > 0; bool isKey = (status & 0x02) > 0; bool isRowVersion = (status & 0x04) > 0; bool isUpdatable = (status & 0x10) > 0; bool allowDBNull = (status & 0x20) > 0; bool isIdentity = (status & 0x40) > 0; Comm.Skip (4); // User type byte type = Comm.GetByte (); bool isBlob = (type == 0x24); TdsColumnType columnType = (TdsColumnType) type; int bufLength = 0; byte precision = 0; byte scale = 0; if (columnType == TdsColumnType.Text || columnType == TdsColumnType.Image) { bufLength = Comm.GetTdsInt (); Comm.Skip (Comm.GetTdsShort ()); } else if (IsFixedSizeColumn (columnType)) bufLength = LookupBufferSize (columnType); else //bufLength = Comm.GetTdsShort (); bufLength = Comm.GetByte (); if (columnType == TdsColumnType.Decimal || columnType == TdsColumnType.Numeric) { precision = Comm.GetByte (); scale = Comm.GetByte (); } Comm.Skip (Comm.GetByte ()); // Locale if (isBlob) Comm.Skip (Comm.GetTdsShort ()); // Class ID int index = result.Add (new TdsDataColumn ()); result[index]["NumericPrecision"] = precision; result[index]["NumericScale"] = scale; result[index]["ColumnSize"] = bufLength; result[index]["ColumnName"] = columnName; result[index]["AllowDBNull"] = allowDBNull; result[index]["IsReadOnly"] = !isUpdatable; result[index]["IsIdentity"] = isIdentity; result[index]["IsRowVersion"] = isRowVersion; result[index]["IsKey"] = isKey; result[index]["Hidden"] = hidden; result[index]["ColumnType"] = columnType; } return result; }