2011-08-29 123 views
1

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

但我想知道在使用企业库在这里我们指定.NET数据类型一样串,我相信企业库调用存储过程时,该类型转换成内部sqldatatype。

db.AddInParameter(CMD “@SortOrder”,DbType.String,SortOrder的)

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

+1

无需担心数据类型转换.NET会照顾它,并自动处理它 – saber

+0

那么为什么我们指定数据类型创建的SqlParameter对象或调用AddInParameter如果.NET需要的是关心什么时候? – trainer

+0

.net能够转换那些可相互转换的数据类型。例如它将二进制数组转换为图像或将字符串转换为文本。 – saber

回答

0

正如我在评论说,没有必要担心数据类型转换.NET会照顾它,并自动处理它。 ADO.net能够将SqlServer中的String数据类型转换为varcharnvarchar,char,ntext,text数据类型。指定存储过程数据类型可让ADO.net将数据转换为SqlServer中的相应数据类型。

为什么我们在创建sqlparameter对象时指定数据类型,或者在.net注意到时调用AddInParameter?

编辑:在评论你的问题基地有:

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

这是没有必要指定输入参数的数据类型。

0

我假设你正在使用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");