C# SqlParameter和数据类型的问题

C# SqlParameter和数据类型的问题,c#,winforms,sql-server-2005,stored-procedures,C#,Winforms,Sql Server 2005,Stored Procedures,我只是调用一个用SQLServer2005开发的存储过程。 这是我存储过程的签名 CREATE PROCEDURE [dbo].[GenericSearch] ( @ModuleName VARCHAR(100), @ViewName VARCHAR(100), @WhereClause_XML XML, @LogicalOperator VARCHAR(3) ) AS BEGIN END 我只是从前端调用这个存储过程,然后像这样传递值 string[] Tables = new strin

我只是调用一个用SQLServer2005开发的存储过程。 这是我存储过程的签名

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);
这里,我为存储过程的所有
varchar
数据类型和一个xml数据类型指定
param.DbType
string

我犯了一个错误

过程需要类型为的参数'@statement' “ntext/nchar/nvarchar”


我只是不明白是什么导致了这个错误。请告诉我如何修复它。

检查存储过程的主体以及它进行的内部调用


可能您正在调用
sp_executesql
,并且正在传递一个简单的
varchar
作为SQL命令体。

检查存储过程体及其内部调用


可能您正在调用
sp_executesql
,并且正在传递一个简单的
varchar
作为SQL命令体。

对于
varchar
使用
DbType.ansisting
,对于
NVARCHAR
使用
DbType.String

下面是我在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);
}

对于
VARCHAR
使用
DbType.AnsiString
,对于
NVARCHAR
使用
DbType.String

下面是我在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);
}

您正在使用sp_executesql,但未传递正确类型的参数@语句是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,并且没有传递正确类型的参数@语句是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)

而且你是清白的。

Hmm似乎很奇怪,我会再次检查你的应用程序是否指向正确的进程,甚至指向正确的数据库。试着放下程序你的应用程序,然后抱怨它不在那里吗?
@statement
来自哪里?@statement是存储过程sp_executesql的第一个参数。嗯,看起来很奇怪,我会再次检查你的应用程序是否指向正确的进程,甚至是正确的数据库。试着放下程序你的应用程序,然后抱怨它不在那里吗?
@statement
来自哪里?@statement是存储过程sp_executesql的第一个参数。