2

所以,我有以下内容:"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 类型,它没有告诉我,例如, aSystem.DecimalDbType.Currencyor DbType.Decimal。因此,当我创建 IDataParameter 时,我不确定要为 DbType 设置什么。

parameter.ColumnName = columnName;
parameter.DbType = DbType.Decimal; (or should it have been Currency?)

基本上,我怎样才能获得表的真实架构......或者它甚至重要吗?

4

2 回答 2

1
IDbCommand command = GetCommand(); //However you want to implement it.

IDbDataParameter param = command.CreateParameter();
//Or some other method that returns a parameter.

command.Parameters.Add(param);
param.Value = thevalue; //You're value here!

可悲的是,如果您使用 IDbCommand,则无法在一行中完成。你不能做类似的事情command.Parameters.Add(param).Value = thevalue;

此外,您不需要设置参数的 DbType。正确的映射会自动为您完成 :)

于 2011-06-14T14:12:33.013 回答
1

如果您正在为存储过程或一些 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 希望这有助于更好地澄清。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx

于 2011-06-14T13:49:12.717 回答