2016-03-28 295 views
6

我收到錯誤錯誤:字符串或二進制數據將被截斷。表值參數的數據不符合參數

字符串或二進制數據將被截斷的表型。表值參數的數據不符合參數的表類型。語句已終止。

存儲過程是:

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)

+0

請發佈您的'表格和您的表格類型的代碼 – Raj

+1

[我們可以停止使用AddWithValue()了嗎?]( http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/) –

+0

這裏是表格設計CREATE TABLE [dbo]。[questiontbl]( 我的問題是關於[問題] [varchar](max)NULL )ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] –

回答

0

目標列的最大長度小於您嘗試插入的值。

右鍵單擊SQL管理器中的表,然後轉到'設計'以可視化您的表結構和列定義。增加列長度

+0

colo \ umn的長度爲Question varchar(MAX) –

+0

錯誤抱怨TVP​​和參數值,而不是表格。不管什麼* table's *模式。 –

0

您尚未發佈MyDataTable用戶定義類型的聲明,但應增加MyDataTable定義中Question列的varchar大小。

DROP TYPE [dbo].[MyDataTable] 
GO 

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

爲addquestion過程以及MyDataTable類型創建一個Drop和Create腳本。

刪除存儲的proc,刪除MyDataTable類型。

按照我提到的編輯MyDataTable Create腳本,然後運行它,然後爲存儲的proc創建零件。

7

我提到了很多網址,但沒有得到適當的解決方案。

的主要原因是這個問題,我們沒有傳遞數據的 指定長度

但在我們實際的代碼,我們將要發送的有效數據,但價值不會通過並將通過提到的問題。

這裏的技巧是,

,同時爲表值參數數據表,我們需要 創建我們在表中創建的順序列值 參數。

請檢查以下代碼。

溶液(以下將工作)

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)); 

原因就在這裏,而我們將數據發送到存儲過程,表值參數採用給定的順序,並在順序現有列中的值相匹配。因此,內容將與存儲過程中的電子郵件地址一起檢查並拋出以下錯誤

錯誤:字符串或二進制數據將被截斷。表值參數的數據不符合參數的表格類型

+1

用了很長時間試圖解決它爲什麼不起作用。感謝+1 – Lee

相關問題