web-dev-qa-db-ja.com

エラー:文字列またはバイナリデータは切り捨てられます。テーブル値パラメーターのデータがパラメーターのテーブルタイプに準拠していません

エラーが発生します

文字列型やバイナリは省略されます。テーブル値パラメーターのデータがパラメーターのテーブルタイプに準拠していません。ステートメントは終了しました。

ストアドプロシージャは次のとおりです。

_CreatePROCEDURE [dbo].[addquestion] 
     @dt as MyDataTable readonly
AS
BEGIN
    insert into questiontbl(Question)
        select(Question) 
        from @dt;
END
_

テーブルは次のとおりです。

_CREATE TABLE [dbo].[questiontbl]
( 
  [checkval] [varchar](max) NULL, 
  [Question] [varchar](max) NULL 
) 
_

C#コード:

_con.Close();
con.Open();

DataTable sqa = Session["questionlist"] as DataTable;

SqlParameter tvparam = cmd.Parameters.AddWithValue("@dt", sqa);                
tvparam.SqlDbType = SqlDbType.Structured;

cmd.ExecuteNonQuery();
_

Cmd.ExecuteNonQuery()は、前述のエラーを返します。データタイプを一致させました-タイプとテーブルもvarchar(max)です。

11

私は多くのURLを参照しましたが、これに対する適切な解決策がありませんでした。

この問題の主な理由は、指定された長さでデータを渡していないことです

しかし、実際のコードでは有効なデータが送信されますが、値は渡されず、前述の問題が発生します。

ここでの秘訣は、

テーブル値パラメーターのデータテーブルを作成するときに、テーブル値パラメーターで作成した順序で列を作成する必要があります。

以下のコードを確認してください。

解決策(以下は機能します)

C#

DataTable users= new DataTable("Users");
users.Columns.Add("EmailAddress", typeof(string));
users.Columns.Add("Content", typeof(string));

DataTable data= users.NewRow();
data["EmailAddress"] = emailAddress;
data["Content"] = content;

Sql

CREATE TYPE [dbo].[ParamEulaEmailUser] AS TABLE(
    [EmailAddress] [nvarchar](50) NOT NULL,
    [Content] [nvarchar](max) NULL
)

以下は機能しません

c#

DataTable users= new DataTable("Users");
users.Columns.Add("Content", typeof(string));
users.Columns.Add("EmailAddress", typeof(string));

この理由は、ストアドプロシージャにデータを送信するときに発生します。テーブル値パラメーターは、指定された順序で値を取得し、その順序の既存の列と一致します。そのため、コンテンツは、ストア内の電子メールアドレスでチェックされますプロシージャと次のエラーをスローします

エラー:文字列またはバイナリデータが切り捨てられます。テーブル値パラメーターのデータがパラメーターのテーブルタイプに準拠していません

11
Jeeva Jsb

MyDataTableユーザー定義型の宣言は投稿していませんが、MyDataTable定義のQuestion列のvarcharサイズを増やす必要があります。

DROP TYPE [dbo].[MyDataTable]
GO

CREATE TYPE [dbo].[MyDataTable] AS TABLE
(
    [Question] [varchar](200) NULL --INCREASE THIS VALUE
)

MyDataTableタイプだけでなく、addquestionプロシージャのDrop and Createスクリプトを作成します。

ストアドプロシージャを削除し、MyDataTableタイプを削除します。

前述のようにMyDataTable Createスクリプトを編集して実行し、ストアドプロシージャのパーツを作成します。

2
callisto

ターゲット列の最大長が、挿入しようとした値よりも短くなっています。

SQLマネージャーでテーブルを右クリックし、[デザイン]に移動してテーブルの構造と列の定義を視覚化します。列の長さを増やす

1