![](/img/trans.png)
[英]The SqlParameterCollection only accepts non-null SqlParameter type objects, not SqlParameter objects in Microsoft.Data.SqlClient
[英]Issue with SqlParameter and data type
我只是在調用用SQL Server 2005開發的存儲過程。這是我的存儲過程的簽名。
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);
在這里,我為存儲的proc和一種xml數據類型的所有varchar
數據類型指定了param.DbType
字符串。
我收到一個錯誤
過程期望類型為'ntext / nchar / nvarchar'的參數'@statement'
我只是不明白是什么原因導致了錯誤。 請告訴我如何解決。
檢查存儲過程的主體及其內部調用。
可能您正在調用sp_executesql
並傳遞一個簡單的varchar
作為SQL命令的主體。
將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);
}
您使用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)
而且您無事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.