?? sqlitedatareader.cs
字號:
/// <param name="i">The index of the column to retrieve</param>
/// <returns>string</returns>
public override string GetDataTypeName(int i)
{
CheckClosed();
SQLiteType typ = GetSQLiteType(i);
if (typ.Type == DbType.Object) return SQLiteConvert.SQLiteTypeToType(typ).Name;
return _activeStatement._sql.ColumnType(_activeStatement, i, out typ.Affinity);
}
/// <summary>
/// Retrieve the column as a date/time value
/// </summary>
/// <param name="i">The index of the column to retrieve</param>
/// <returns>DateTime</returns>
public override DateTime GetDateTime(int i)
{
VerifyType(i, DbType.DateTime);
return _activeStatement._sql.GetDateTime(_activeStatement, i);
}
/// <summary>
/// Retrieve the column as a decimal value
/// </summary>
/// <param name="i">The index of the column to retrieve</param>
/// <returns>decimal</returns>
public override decimal GetDecimal(int i)
{
VerifyType(i, DbType.Decimal);
return Convert.ToDecimal(_activeStatement._sql.GetDouble(_activeStatement, i));
}
/// <summary>
/// Returns the column as a double
/// </summary>
/// <param name="i">The index of the column to retrieve</param>
/// <returns>double</returns>
public override double GetDouble(int i)
{
VerifyType(i, DbType.Double);
return _activeStatement._sql.GetDouble(_activeStatement, i);
}
/// <summary>
/// Returns the .NET type of a given column
/// </summary>
/// <param name="i">The index of the column to retrieve</param>
/// <returns>Type</returns>
public override Type GetFieldType(int i)
{
CheckClosed();
return SQLiteConvert.SQLiteTypeToType(GetSQLiteType(i));
}
/// <summary>
/// Returns a column as a float value
/// </summary>
/// <param name="i">The index of the column to retrieve</param>
/// <returns>float</returns>
public override float GetFloat(int i)
{
VerifyType(i, DbType.Single);
return Convert.ToSingle(_activeStatement._sql.GetDouble(_activeStatement, i));
}
/// <summary>
/// Returns the column as a Guid
/// </summary>
/// <param name="i">The index of the column to retrieve</param>
/// <returns>Guid</returns>
public override Guid GetGuid(int i)
{
TypeAffinity affinity = VerifyType(i, DbType.Guid);
if (affinity == TypeAffinity.Blob)
{
byte[] buffer = new byte[16];
_activeStatement._sql.GetBytes(_activeStatement, i, 0, buffer, 0, 16);
return new Guid(buffer);
}
else
return new Guid(_activeStatement._sql.GetText(_activeStatement, i));
}
/// <summary>
/// Returns the column as a short
/// </summary>
/// <param name="i">The index of the column to retrieve</param>
/// <returns>Int16</returns>
public override Int16 GetInt16(int i)
{
VerifyType(i, DbType.Int16);
return Convert.ToInt16(_activeStatement._sql.GetInt32(_activeStatement, i));
}
/// <summary>
/// Retrieves the column as an int
/// </summary>
/// <param name="i">The index of the column to retrieve</param>
/// <returns>Int32</returns>
public override Int32 GetInt32(int i)
{
VerifyType(i, DbType.Int32);
return _activeStatement._sql.GetInt32(_activeStatement, i);
}
/// <summary>
/// Retrieves the column as a long
/// </summary>
/// <param name="i">The index of the column to retrieve</param>
/// <returns>Int64</returns>
public override Int64 GetInt64(int i)
{
VerifyType(i, DbType.Int64);
return _activeStatement._sql.GetInt64(_activeStatement, i);
}
/// <summary>
/// Retrieves the name of the column
/// </summary>
/// <param name="i">The index of the column to retrieve</param>
/// <returns>string</returns>
public override string GetName(int i)
{
CheckClosed();
return _activeStatement._sql.ColumnName(_activeStatement, i);
}
/// <summary>
/// Retrieves the i of a column, given its name
/// </summary>
/// <param name="name">The name of the column to retrieve</param>
/// <returns>The int i of the column</returns>
public override int GetOrdinal(string name)
{
CheckClosed();
return _activeStatement._sql.ColumnIndex(_activeStatement, name);
}
/// <summary>
/// Schema information in SQLite is difficult to map into .NET conventions, so a lot of work must be done
/// to gather the necessary information so it can be represented in an ADO.NET manner.
/// </summary>
/// <returns>Returns a DataTable containing the schema information for the active SELECT statement being processed.</returns>
public override DataTable GetSchemaTable()
{
return GetSchemaTable(true, true);
}
internal DataTable GetSchemaTable(bool wantUniqueInfo, bool wantDefaultValue)
{
CheckClosed();
DataTable tbl = new DataTable("SchemaTable");
DataTable tblIndexes = null;
DataTable tblIndexColumns;
DataRow row;
string temp;
string strCatalog = "";
string strTable = "";
string strColumn = "";
tbl.Locale = CultureInfo.InvariantCulture;
tbl.Columns.Add(SchemaTableColumn.ColumnName, typeof(String));
tbl.Columns.Add(SchemaTableColumn.ColumnOrdinal, typeof(int));
tbl.Columns.Add(SchemaTableColumn.ColumnSize, typeof(int));
tbl.Columns.Add(SchemaTableColumn.NumericPrecision, typeof(short));
tbl.Columns.Add(SchemaTableColumn.NumericScale, typeof(short));
tbl.Columns.Add(SchemaTableColumn.IsUnique, typeof(Boolean));
tbl.Columns.Add(SchemaTableColumn.IsKey, typeof(Boolean));
tbl.Columns.Add(SchemaTableOptionalColumn.BaseServerName, typeof(string));
tbl.Columns.Add(SchemaTableOptionalColumn.BaseCatalogName, typeof(String));
tbl.Columns.Add(SchemaTableColumn.BaseColumnName, typeof(String));
tbl.Columns.Add(SchemaTableColumn.BaseSchemaName, typeof(String));
tbl.Columns.Add(SchemaTableColumn.BaseTableName, typeof(String));
tbl.Columns.Add(SchemaTableColumn.DataType, typeof(Type));
tbl.Columns.Add(SchemaTableColumn.AllowDBNull, typeof(Boolean));
tbl.Columns.Add(SchemaTableColumn.ProviderType, typeof(int));
tbl.Columns.Add(SchemaTableColumn.IsAliased, typeof(Boolean));
tbl.Columns.Add(SchemaTableColumn.IsExpression, typeof(Boolean));
tbl.Columns.Add(SchemaTableOptionalColumn.IsAutoIncrement, typeof(Boolean));
tbl.Columns.Add(SchemaTableOptionalColumn.IsRowVersion, typeof(Boolean));
tbl.Columns.Add(SchemaTableOptionalColumn.IsHidden, typeof(Boolean));
tbl.Columns.Add(SchemaTableColumn.IsLong, typeof(Boolean));
tbl.Columns.Add(SchemaTableOptionalColumn.IsReadOnly, typeof(Boolean));
tbl.Columns.Add(SchemaTableOptionalColumn.ProviderSpecificDataType, typeof(Type));
tbl.Columns.Add(SchemaTableOptionalColumn.DefaultValue, typeof(object));
tbl.Columns.Add("DataTypeName", typeof(string));
tbl.BeginLoadData();
for (int n = 0; n < _fieldCount; n++)
{
row = tbl.NewRow();
// Default settings for the column
row[SchemaTableColumn.ColumnName] = GetName(n);
row[SchemaTableColumn.ColumnOrdinal] = n;
row[SchemaTableColumn.ColumnSize] = SQLiteConvert.DbTypeToColumnSize(GetSQLiteType(n).Type);
row[SchemaTableColumn.NumericPrecision] = 255;
row[SchemaTableColumn.NumericScale] = 255;
row[SchemaTableColumn.ProviderType] = GetSQLiteType(n).Type;
row[SchemaTableColumn.IsLong] = (GetSQLiteType(n).Type == DbType.Binary);
row[SchemaTableColumn.AllowDBNull] = true;
row[SchemaTableOptionalColumn.IsReadOnly] = false;
row[SchemaTableOptionalColumn.IsRowVersion] = false;
row[SchemaTableColumn.IsUnique] = false;
row[SchemaTableColumn.IsKey] = false;
row[SchemaTableOptionalColumn.IsAutoIncrement] = false;
row[SchemaTableOptionalColumn.IsReadOnly] = false;
row[SchemaTableColumn.DataType] = GetFieldType(n);
row[SchemaTableOptionalColumn.IsHidden] = false;
strColumn = _command.Connection._sql.ColumnOriginalName(_activeStatement, n);
if (String.IsNullOrEmpty(strColumn) == false) row[SchemaTableColumn.BaseColumnName] = strColumn;
row[SchemaTableColumn.IsExpression] = String.IsNullOrEmpty(strColumn);
row[SchemaTableColumn.IsAliased] = (String.Compare(GetName(n), strColumn, true, CultureInfo.InvariantCulture) != 0);
temp = _command.Connection._sql.ColumnTableName(_activeStatement, n);
if (String.IsNullOrEmpty(temp) == false) row[SchemaTableColumn.BaseTableName] = temp;
temp = _command.Connection._sql.ColumnDatabaseName(_activeStatement, n);
if (String.IsNullOrEmpty(temp) == false) row[SchemaTableOptionalColumn.BaseCatalogName] = temp;
string dataType = null;
// If we have a table-bound column, extract the extra information from it
if (String.IsNullOrEmpty(strColumn) == false)
{
string collSeq;
bool bNotNull;
bool bPrimaryKey;
bool bAutoIncrement;
string[] arSize;
// Get the column meta data
_command.Connection._sql.ColumnMetaData(
(string)row[SchemaTableOptionalColumn.BaseCatalogName],
(string)row[SchemaTableColumn.BaseTableName],
strColumn,
out dataType, out collSeq, out bNotNull, out bPrimaryKey, out bAutoIncrement);
if (bNotNull || bPrimaryKey) row[SchemaTableColumn.AllowDBNull] = false;
row[SchemaTableColumn.IsKey] = bPrimaryKey;
row[SchemaTableOptionalColumn.IsAutoIncrement] = bAutoIncrement;
// For types like varchar(50) and such, extract the size
arSize = dataType.Split('(');
if (arSize.Length > 1)
dataType = arSize[0];
arSize = arSize[1].Split(')');
if (arSize.Length > 1)
{
arSize = arSize[0].Split(',', '.');
if (GetSQLiteType(n).Type == DbType.String || GetSQLiteType(n).Type == DbType.Binary)
{
row[SchemaTableColumn.ColumnSize] = Convert.ToInt32(arSize[0], CultureInfo.InvariantCulture);
}
else
{
row[SchemaTableColumn.NumericPrecision] = Convert.ToInt32(arSize[0], CultureInfo.InvariantCulture);
if (arSize.Length > 1)
row[SchemaTableColumn.NumericScale] = Convert.ToInt32(arSize[1], CultureInfo.InvariantCulture);
}
}
}
if (wantDefaultValue)
{
// Determine the default value for the column, which sucks because we have to query the schema for each column
using (SQLiteCommand cmdTable = new SQLiteCommand(String.Format(CultureInfo.InvariantCulture, "PRAGMA [{0}].TABLE_INFO([{1}])",
row[SchemaTableOptionalColumn.BaseCatalogName],
row[SchemaTableColumn.BaseTableName]
), _command.Connection))
using (DbDataReader rdTable = cmdTable.ExecuteReader())
{
// Find the matching column
while (rdTable.Read())
{
if (String.Compare((string)row[SchemaTableColumn.BaseColumnName], rdTable.GetString(1), true, CultureInfo.InvariantCulture) == 0)
{
if (rdTable.IsDBNull(4) == false)
row[SchemaTableOptionalColumn.DefaultValue] = rdTable[4];
break;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -