2012-01-06 15 views
1

SQL Server 2005で開発されたストアドプロシージャを呼び出すだけです。 ここに格納されているprocの署名があります。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); 

のように値を渡す私は、ストアドプロシージャと1つのXMLデータ型のすべての私のvarcharデータ型のためにそのparam.DbType文字列を指定します。

私はエラーを取得しています

手順は、私はちょうど、エラーの原因を理解していない

'ntext型/ NCHAR/NVARCHAR' タイプ のパラメータ '@statement' を期待しています。それを修正する方法を教えてください。

+0

私はあなたのアプリケーションが間違いなく正確なprocまたは正しいDBを指していることを再確認します。 procを落としてみて、あなたのアプリをやってもらえませんか? –

+0

'@ statement 'はどこから来ますか? –

+0

エラーメッセージが表示されます。 – Thomas

答えて

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 

これは、あなたが取得し、同じ例外をスローする必要があります。しかし、このようなデータ型はnvarcharにvarchar型から変数@yourSqlの宣言を変更:

DECLARE @yourSql nvarchar(max) 

そして、あなたは明らかにしています。

1

ストアドプロシージャの本体と内部コールを確認します。

おそらくsp_executesqlを呼び出しており、単純なvarcharをSQLコマンドの本体として渡していると思われます。

+0

はいu r右。それを修正する方法。 – Thomas

+1

@Thomasはエラーメッセージを読み、それに応じて行動します。 –

0

DbType.AnsiStringVARCHARに、DbType.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); 
}