问题与SqlParameter和数据类型
我只是调用一个存储过程,它是用SQL Server 2005开发的。 这里是我存储过程的签名。问题与SqlParameter和数据类型
CREATE PROCEDURE [dbo].[GenericSearch]
(
@ModuleName VARCHAR(100),
@ViewName VARCHAR(100),
@WhereClause_XML XML,
@LogicalOperator VARCHAR(3)
)
AS
BEGIN
END
我只是从我的前端调用这个存储过程并传递价值像
string[] Tables = new string[] { "TPMaster" };
SqlParameter[] cparams = new SqlParameter[4];
SqlParameter param;
param = new SqlParameter("@ModuleName", ModuleName);
param.DbType = DbType.String;
cparams[0] = param;
param = new SqlParameter("@ViewName", DataSource);
param.DbType = DbType.String;
cparams[1] = param;
param = new SqlParameter("@WhereClause_XML", strXml);
param.DbType = DbType.Xml;
cparams[2] = param;
param = new SqlParameter("@LogicalOperator", (rbAnd.Checked ? "AND" : "OR"));
param.DbType = DbType.String;
cparams[3] = param;
ds = Business.Common.GetDataSet("GenericSearch", cparams, Tables);
在这里,我指定param.DbType
字符串为我所有varchar
数据类型存储过程和一个XML数据类型。
我得到一个错误
过程需要 类型的参数“@statement 'NTEXT/NCHAR/nvarchar的'
我只是不明白是什么原因造成的错误。请告诉我如何解决它。
你的使用sp_executesql,而不是传递正确的参数的类型。 @statement是sp_executesql所需的参数,必须是unicode常量或unicode变量。我假设你的建立一个基于你接受的存储过程值的SQL语句。
考虑这个例子:
DECLARE @FieldName VARCHAR(100),@TableName VARCHAR(100),@WhereClause varchar(100)
SET @FieldName = 'ItemID'
SET @TableName = 'Item'
SET @WhereClause = 'ItemID > 200'
DECLARE @yourSql varchar(max)
SET @yourSql = 'SELECT ' + @FieldName + ' FROM ' + @TableName + ' WHERE ' + @WhereClause
EXEC sp_executesql @yourSql
这应该会让你得到同样的异常。但是,将变量@yourSql的声明从varchar更改为如下所示的nvarchar:
DECLARE @yourSql nvarchar(max)
而且你很清楚。
检查存储过程的主体以及它所做的内部调用。
可能您正在拨打sp_executesql
并正在传递一个简单的varchar
作为SQL命令的主体。
是的,您是对的。所以如何解决它。 – Thomas 2012-01-06 13:22:45
@Thomas阅读错误消息...并采取相应措施。 – 2012-01-06 13:25:12
使用DbType.AnsiString
为VARCHAR
和DbType.String
为NVARCHAR
。
这里是一个代码段,我在O/R映射器用于:
switch (systemType) {
case 127: // bigint
return DbType.Int64;
case 173: // binary
case 189: // timestamp
case 165: // varbinary, varbinary MAX
case 34: // image
return DbType.Binary;
case 98: // sql_variant
return DbType.Object;
case 104: // bit
return DbType.Boolean;
case 175: // char
return DbType.AnsiStringFixedLength;
case 61: // datetime
case 58: // smalldatetime
return DbType.DateTime;
case 106: // decimal
case 108: // numeric
return DbType.Decimal;
case 62: // float
return DbType.Double;
case 56: // int
return DbType.Int32;
case 60: // money
case 122: // smallmoney
return DbType.Currency;
case 239: // nchar
return DbType.StringFixedLength;
case 99: // ntext
case 231: // nvarchar, nvarchar MAX
return DbType.String;
case 59: // real
return DbType.Single;
case 52: // smallint
return DbType.Int16;
case 35: // text
case 167: // varchar, varchar MAX
return DbType.AnsiString;
case 48: // tinyint
return DbType.Byte;
case 36: // uniqueidentifier
return DbType.Guid;
case 241: // xml
return DbType.Xml;
default:
return (DbType)(-1);
}
嗯看起来很奇怪,我会仔细检查你的应用程序肯定是指向正确的过程,甚至是正确的数据库。尝试删除proc,你的应用程序会不会在那里呻吟? – 2012-01-06 13:14:06
'@ statement'从哪里来? – 2012-01-06 13:15:29
它在错误信息中。 – Thomas 2012-01-06 13:18:04