エラーが発生します
文字列型やバイナリは省略されます。テーブル値パラメーターのデータがパラメーターのテーブルタイプに準拠していません。ステートメントは終了しました。
ストアドプロシージャは次のとおりです。
_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)
です。
私は多くの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));
この理由は、ストアドプロシージャにデータを送信するときに発生します。テーブル値パラメーターは、指定された順序で値を取得し、その順序の既存の列と一致します。そのため、コンテンツは、ストア内の電子メールアドレスでチェックされますプロシージャと次のエラーをスローします
エラー:文字列またはバイナリデータが切り捨てられます。テーブル値パラメーターのデータがパラメーターのテーブルタイプに準拠していません
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スクリプトを編集して実行し、ストアドプロシージャのパーツを作成します。
ターゲット列の最大長が、挿入しようとした値よりも短くなっています。
SQLマネージャーでテーブルを右クリックし、[デザイン]に移動してテーブルの構造と列の定義を視覚化します。列の長さを増やす