2012-09-27 23 views
0

我有一個SQL中的過程,獲得@tpv作爲參數。當我從c#執行程序 - 它不工作,當我從Sql執行程序 - 它的工作完美。爲什麼?過程與@tpv不工作從C#

編輯:當我從c#執行proc時 - 它沒有得到一個錯誤,好像它工作正常,但表完全沒有改變,並且misRow=0而不是misRow=1

步驟:

從SQL
CREATE procedure [dbo].[UpdateAdsList] 
@tvp ListCrc32 readonly 
as 
update tb 
set a_update=CONVERT(date,GETDATE(),101) 
from Ads tb 
join @tvp t on t.crc32 = a_crc32 

高管:

declare @ ListCrc32 

insert into @ (crc32) 
select 1652908150 

exec UpdateAdsList @ 

Exec的從C#:

int mis=1652908150; 

//create the dataTable 
dt = new DataTable(); 
dt.Columns.Add("crc32", typeof(int)); 
var row = dt.NewRow(); 
row["crc32"] = mis; 
dt.Rows.Add(row); 

//exec the proc 
con.Open(); 
var cmd = new SqlCommand("UpdateAdsList",con); 
cmd.Parameters.Add("@tvp",SqlDbType.Structured); 
cmd.Parameters["@tvp"].Value = dt; 
cmd.Parameters["@tvp"].TypeName = "ListCrc32"; 
int misRow=cmd.ExecuteNonQuery(); 
con.close(); 
+1

「不工作」是什麼意思?你得到一個錯誤?如果是這樣? –

+0

我更新了我的問題 –

+0

我不知道它是否有任何區別,但只是想知道。你的列是typeof(int),爲什麼你把mis轉換成double? –

回答

1

您可以嘗試添加參數不帶類型:

int mis=1652908150; 

//create the dataTable 
dt = new DataTable(); 
dt.Columns.Add("crc32", typeof(int)); 
var row = dt.NewRow(); 
row["crc32"] = mis; // I do not see the point of convert. 
dt.Rows.Add(row); 

//exec the proc 
var cmd = new SqlCommand("UpdateAdsList",con); 
cmd.CommandType = Syste.Data.CommandType.StoredProcedure; 

cmd.Parameters.AddWithValue("@tvp",dt); 

con.Open(); 

int misRow=cmd.ExecuteNonQuery(); 

con.close(); 
+0

它引發錯誤:「表格類型參數'@ tvp'必須是有效類型。」 –

+0

有趣的是,只要類型在數據庫中定義良好,就沒有理由出現該錯誤。 –

+0

這個類型在我的數據庫中已經定義好了。我不知道爲什麼會引發錯誤。 –