2015-06-02 77 views
3

我試圖運行測試用例,這將不會工作... 我在這裏做錯了什麼?C#將表值參數傳遞給SqlCommand不工作

這裏的SQL:

CREATE TABLE 
    Playground.Test (saved DateTime) 
GO 
CREATE TYPE 
    Playground.DateTimeTable AS TABLE 
    ([time] DATETIME); 
GO 
CREATE PROCEDURE 
    Playground.InsertDate 
    @dt Playground.DateTimeTable READONLY 
AS 
    BEGIN 
     INSERT INTO Playground.Test (saved) 
     SELECT [time] 
     FROM @dt 
    END 
GO 

和代碼連接並執行該過程:

const String connString = 
    "server = SERVER; database = DB; UID = myUserID; pwd = myPassword;"; 
static void Main(string[] args) 
{ 
    SqlCommand command = 
     new SqlCommand(
      "EXEC Playground.InsertDate", 
      new SqlConnection(connString)); 

    DataTable table = new DataTable("DateTimeTable"); 
    table.Columns.Add("[time]", typeof(DateTime)); 
    table.Rows.Add(DateTime.Parse("10/27/2004")); 

    SqlParameter tvp = command.Parameters.AddWithValue("@dt", table); 
    tvp.SqlDbType = SqlDbType.Structured; 
    tvp.TypeName = "Playground.DateTimeTable"; 

    command.Connection.Open(); 
    int affected = command.ExecuteNonQuery(); 
    command.Connection.Close(); 

    Console.WriteLine(affected); 
    Console.ReadKey(); 
} 

我沒有得到任何錯誤。只有0行受到影響。

這個工作在SQL Server中,雖然:

DECLARE @dt Playground.DateTimeTable 
INSERT INTO @dt VALUES ('2004-10-27') 
EXEC Playground.InsertDate @dt 

那我在這裏做什麼?

+0

你可以分析你的服務器來查看正在執行的SQL嗎? – DavidG

+2

雖然我會建議從命令中刪除'EXEC'並設置'command.CommandType = CommandType.StoredProcedure'。 – DavidG

+0

@DavidG另一種解決方案是使命令文本爲'EXEC Playground.InsertDate @ dt'。感謝您的線索! –

回答

1

您沒有將您的SqlCommand對象設置爲存儲過程。你應該做兩件事情:

  1. 從字符串中取出EXEC前綴〜(這是沒有必要的)
  2. 設置command是一個存儲過程:

    command.CommandType = CommandType.StoredProcedure; 
    
  3. 不知道如何圍繞DataTable列方括號的方括號也會影響到這一點,但我懷疑它們在刪除後會更好。
+0

方括號只是從自動生成的代碼中提取出來的,它只是有助於防止轉義問題,如名稱以數字開頭,名稱中的空格或名稱與「FROM」之類的保留字相同。方括號強制「這些括號內的開頭和結尾之間的所有內容都是對象名稱」。自動生成的代碼更容易讓他們在那裏,而不是檢測他們什麼時候需要它們,而只是隨後添加它們。 –

+0

@ScottChamberlain我知道(至少在SQL Server中),我只是不確定它們在'DataTable'列名的上下文中是否需要。 – DavidG

+0

AHH,你在哪裏談論'table.Columns.Add(「[time]」,typeof(DateTime));',我沒有看到。我想你在哪裏談論'([時間] DATETIME);' –