我一直在使用企业库。我们正在将数据库类型varchar更改为数据库中的nvarchar以支持不同的语言。我们确实有一些遗留代码使用传统方式连接到数据库,就像使用命令对象一样。在该代码中,在创建sqlparameters时,指定参数的数据类型,无论是int还是varchar。在那里很容易从varchar更改为nvarchar。
但我想知道在使用企业库时,我们指定.net数据类型,如字符串,我相信企业库在调用存储过程时会在内部将该类型转换为sqldatatype。
db.AddInParameter(cmd,“@ SortOrder”,DbType.String,SortOrder)
企业库内部转换的数据类型是什么? varchar还是nvarchar?在遗留代码中我们使用nvarchar是否安全?
答案 0 :(得分:1)
正如我在评论中所说的,无需担心数据类型转换.net会处理它并自动处理它。 ADO.net能够将String
数据类型转换为SqlServer中的varchar
,nvarchar
,char
,ntext
,text
数据类型。指定存储过程数据类型会通知ADO.net将数据转换为SqlServer中的相应数据类型。
为什么我们在创建sqlparameter对象时指定数据类型,或者如果.net负责处理那么调用AddInParameter?
编辑:根据您在评论中的问题,有:
db.Parameters.AddWithValue("@SortOrder", SortOrder);
,无需指定输入参数的数据类型。
答案 1 :(得分: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");