【问题标题】:enterprise library dbcommand AddInParameter method企业库 dbcommand AddInParameter 方法
【发布时间】:2011-11-06 07:13:16
【问题描述】:

我很长时间以来一直在使用企业库。我们正在将数据库中的列类型 varchar 更改为 nvarchar 以支持不同的语言。我们确实有一些遗留代码使用传统方式连接到数据库,例如使用命令对象。在该代码中,当创建 sqlparameters 时,指定参数的数据类型是 int 还是 varchar。在那里从 varchar 更改为 nvarchar 很容易。

但我想知道在使用企业库时我们指定.net 数据类型(如字符串),我相信企业库在调用存储过程时会在内部将该类型转换为 sqldatatype。

db.AddInParameter(cmd, "@SortOrder", DbType.String, SortOrder)

企业库内部转换什么数据类型? varchar 还是 nvarchar?在我们拥有的遗留代码中的所有地方都使用 nvarchar 是否安全?

【问题讨论】:

  • 不用担心数据类型转换.net会自动处理并处理
  • 那为什么我们在创建 sqlparameter 对象或调用 AddInParameter 时指定数据类型(如果 .net 负责)?
  • .net 能够转换那些可以相互转换的数据类型。例如它将二进制数组转换为图像或字符串转换为文本。

标签: c# .net ado.net enterprise-library


【解决方案1】:

正如我在 cmets 中所说,无需担心数据类型转换 .net 会自动处理并处理它。 ADO.net 能够将 String 数据类型转换为 SqlServer 中的 varcharnvarcharcharntexttext 数据类型。指定存储过程数据类型通知 ADO.net 将数据转换为 SqlServer 中的适当数据类型。

为什么我们在创建 sqlparameter 对象或调用 AddInParameter(如果 .net 负责)时指定数据类型?

编辑:根据您在 cmets 中的问题,有:

db.Parameters.AddWithValue("@SortOrder", SortOrder);

不需要指定输入参数的数据类型。

【讨论】:

    【解决方案2】:

    我假设您使用的是 SQL Server。

    DbType.String 用于 nvarchar,而 DbType.AnsiString 用于 varchar。 http://msdn.microsoft.com/en-us/library/system.data.dbtype.aspx

    由于您正在调用存储过程,因此您的参数会自动转换为存储过程中指定的任何字符串类型。例如,如果输入是 DbType.String 但参数是 varchar,SQL Server 会为您转换。但是不要反向执行(在 DbType.AnsiString 中的代码中,但存储过程需要 nvarchar),因为您只会在存储过程中获得 ansi 字符。

    //Don't do this! you will get 'h?ello' in the SP instead of 'hܒello'
    SqlParameter("input", "h\u0712ello") { DbType = System.Data.DbType.AnsiString });
    

    另外,在 EntLib 中,有一种方法可以调用存储过程,而无需指定参数名称和数据类型。像这样:

    //calls AddToInventory stored procedure
    //the 2 parameters are automatically mapped.
    db.ExecuteNonQuery("AddToInventory", 1, "Life Jacket");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多