2012-01-06 47 views
1

我只是调用一个存储过程,它是用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的'

我只是不明白是什么原因造成的错误。请告诉我如何解决它。

+0

嗯看起来很奇怪,我会仔细检查你的应用程序肯定是指向正确的过程,甚至是正确的数据库。尝试删除proc,你的应用程序会不会在那里呻吟? – 2012-01-06 13:14:06

+0

'@ statement'从哪里来? – 2012-01-06 13:15:29

+0

它在错误信息中。 – Thomas 2012-01-06 13:18:04

回答

0

你的使用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) 

而且你很清楚。

1

检查存储过程的主体以及它所做的内部调用。

可能您正在拨打sp_executesql并正在传递一个简单的varchar作为SQL命令的主体。

+0

是的,您是对的。所以如何解决它。 – Thomas 2012-01-06 13:22:45

+1

@Thomas阅读错误消息...并采取相应措施。 – 2012-01-06 13:25:12

0

使用DbType.AnsiStringVARCHARDbType.StringNVARCHAR

这里是一个代码段,我在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); 
}