- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
所以,我有以下内容:"SELECT * FROM MyTable;"
当我执行以下操作时,我得到了 TableData,这很有用,但仍然有一些未知的东西?
//CommandBehavior.KeyInfo seems to actually return the correct primary keys
// not so much with CommandBehavior.SchemaOnly.
IDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo)
DataTable table = reader.GetSchemaTable();
现在,当遍历我的表时,我遇到一个名为“DataType”的列,它是 System.String 或 System.Byte[] 或 System.Int32 等。但是,这只告诉我 .NET 类型例如,System.Decimal
是 DbType.Currency
还是 DbType.Decimal
。因此,当我创建 IDataParameter 时,我不确定要为 DbType 设置什么。
parameter.ColumnName = columnName;
parameter.DbType = DbType.Decimal; (or should it have been Currency?)
基本上,我如何才能获得表的真实架构...或者这有什么关系吗?
最佳答案
如果您正在为存储过程或某些 sql 文本传递参数,则不需要指定参数数据类型。 SqlCommand 将为您正确分配数据类型。
我相信在参数上分配 DBType 的能力是如果你想覆盖系统会为你选择的内容。
使用
SqlCommand.Parameters.AddWithValue("@parameterName", valueAsObject);
命令
编辑您使用的是 IDbCommand,而不是 SqlCommand。我知道SqlCommand和Oracle命令都不需要你指定DbType,但我不知道其他框架是否需要你显式设置DbType。这是一种将 system.type 转换为 DbType 枚举值的方法:
Class DBTypeConversion
{
private static String[,] DBTypeConversionKey = new String[,]
{
{"BigInt","System.Int64"},
{"Binary","System.Byte[]"},
{"Bit","System.Boolean"},
{"Char","System.String"},
{"DateTime","System.DateTime"},
{"Decimal","System.Decimal"},
{"Float","System.Double"},
{"Image","System.Byte[]"},
{"Int","System.Int32"},
{"Money","System.Decimal"},
{"NChar","System.String"},
{"NText","System.String"},
{"NVarChar","System.String"},
{"Real","System.Single"},
{"SmallDateTime","System.DateTime"},
{"SmallInt","System.Int16"},
{"SmallMoney","System.Decimal"},
{"Text","System.String"},
{"Timestamp","System.DateTime"},
{"TinyInt","System.Byte"},
{"UniqueIdentifer","System.Guid"},
{"VarBinary","System.Byte[]"},
{"VarChar","System.String"},
{"Variant","System.Object"}
};
public static SqlDbType SystemTypeToDbType( System.Type sourceType )
{
SqlDbType result;
String SystemType = sourceType.ToString();
String DBType = String.Empty;
int keyCount = DBTypeConversionKey.GetLength(0);
for(int i=0;i<keyCount;i++)
{
if(DBTypeConversionKey[i,1].Equals(SystemType)) DBType = DBTypeConversionKey[i,0];
}
if (DBType==String.Empty) DBType = "Variant";
result = (SqlDbType)Enum.Parse(typeof(SqlDbType), DBType);
return result;
}
public static Type DbTypeToSystemType( SqlDbType sourceType )
{
Type result;
String SystemType = String.Empty;
String DBType = sourceType.ToString();
int keyCount = DBTypeConversionKey.GetLength(0);
for(int i=0;i<keyCount;i++)
{
if(DBTypeConversionKey[i,0].Equals(DBType)) SystemType = DBTypeConversionKey[i,1];
}
if (SystemType==String.Empty) SystemType = "System.Object";
result = Type.GetType(SystemType);
return result;
}
http://social.msdn.microsoft.com/Forums/en/winforms/thread/c6f3ab91-2198-402a-9a18-66ce442333a6希望这有助于更好地澄清。
关于C#:映射 IDataReader.GetTableSchema() 和 DbType 枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6344326/
我接管了一些 C# 代码。 代码正在使用一些使用参数的 SQL 访问数据库。 所有字符串参数的类型都是 DbType.AnsiString 而不是 DbType.String。 为什么要使用 DbTy
我有一个结构,我想让它更容易填充 public struct DBParameter { public string parameterName; pu
根据MSDN docs ,列类型/元素的 DbType 属性/属性仅用于数据库创建。 然而,今天,当尝试将数据提交到 SQLCE 数据库上的 IMAGE 列时(不确定是否仅在 CE 上),我收到了“数
当我传递空值时,SQL 更新语句出现问题(或者更好的说法是 DbNull 值)到 DbParameter 对象。当我将 DbNull 值传递给 Value 属性时,DbParameter 对象仍然是
[Microsoft.SqlServer.Server.SqlProcedure] public static void MyMethod() { string con
我将参数传递给存储过程: param = CreateInParameter("Result", DbType.Decimal); param.Value = testresults.Result;
首先,我喜欢指定数据类型并且鄙视 AddWithValue 函数。 我正在 .NET 4.0 下构建一个将在用户 PC 上运行的 SqlCeServer 3.5 本地数据库应用程序。 当我创建表时,我
当我尝试执行此查询时: var q = session.QueryOver(); q.Select(Projections.Avg(x => x.AccountBal
有谁知道等同于 SqlDbType.Bit 的 DbType 是什么? 我正在尝试转换 param[0] = new SqlParameter("@Status", SqlDbType.Bit); p
如何最好地将 System.Data.DbType 枚举值转换为相应的(或至少一个可能的相应)System.Type 值? 例如: DbType.StringFixedLength -> System
我正在尝试为自定义用户类型注册新的 DbType,它只允许我使用 asp.net DbType 来关联我创建的自定义用户类型。例如: /// /// An SQL dialect for P
SqlDataReader SqlTypes 和 DbType 类型访问器有什么区别? 什么时候使用哪个更合适? 最佳答案 如果您的代码需要与提供程序无关并针对多个数据库系统工作,则应避免使用 SQL
我需要从 DbParameter.DbType 打印真实的数据库类型名称,但是当我做这样的事情时 DbParameter.DbType.ToString() 我得到了例如 Int32 而不是 int,
所以,我有以下内容:"SELECT * FROM MyTable;" 当我执行以下操作时,我得到了 TableData,这很有用,但仍然有一些未知的东西? //CommandBehavior.KeyI
我正在使用通用 IDbCommand 函数(在非 SqlCommand 辅助方法中)将 SqlCommand.DbType 设置为 DbType.Date,类似于此: var para
我有一个包含 DateTimeOffset 对象的 SQL Server 2008 数据库。根据 this page , SQL Server Compact provides support for
找到System.Data.DbType 的最佳方法是什么?系统命名空间中基类库类型的枚举值? 最佳答案 一种常见的方法是使用类型映射,明确映射所有支持的类型(不同的连接器/提供程序支持不同的类型)。
我在我们的 SQL Server 2016 数据库中有一个表字段( TotalPrice ) numeric(20, 3)数据类型。 我用过 ulong type 作为我的 C# 属性类型。 publ
我在下面的代码中有一个魔数(Magic Number)... Microsoft.Practices.EnterpriseLibrary.Data.Database db = /* code omit
我正在使用带有 DAAB 4.0 框架的 c# 从 MS SQL 2008 数据库中读取列类型为 dbtype.time 的结果。 我的问题是 MSDN 文档说 dbtype.time 应该映射到一个
我是一名优秀的程序员,十分优秀!