2015-05-08 92 views
1

如何在插入前避免重複的數據。我使用下面的代碼,但我得到這個錯誤。執行插入查詢時出錯

沒有爲'temp'的列1指定列名稱。

'temp'的列2沒有指定列名。

沒有爲'temp'的列3指定列名稱。

'temp'的列4沒有指定列名。

沒有爲'temp'的列5指定列名稱。

沒有爲'temp'的列6指定列名稱。

沒有爲'temp'的列8指定列名稱。

沒有爲'temp'的列9指定列名稱。

列名'datelist'無效。

using (SqlConnection con2 = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
     { 
      var fromdate = DateTime.Parse(txtfromdate.Text); 
      var todate = DateTime.Parse(txttodate.Text); 
      var datedif1 = (todate - fromdate).Days; 

      var sqlInsert = new SqlCommand("INSERT INTO datelist ([datedif],[batch],[daywk],[semester],[weekbatch],[subject],[facultyname],[facultyid],[WeekMonth]) SELECT * from (SELECT @datedif,@batch,@daywk,@semester,@weekbatch,@subject,@facultyname,@facultyid,@weekMonth) AS temp WHERE NOT EXISTS (SELECT datelist,batch from datelist where [email protected] and [email protected])", con2); 

      var sqlParamater = sqlInsert.Parameters.Add("@datedif", SqlDbType.Date); 
      var sqlParameter1 = sqlInsert.Parameters.Add("@batch", SqlDbType.NVarChar); 
      var sqlParameter2 = sqlInsert.Parameters.Add("@daywk", SqlDbType.NVarChar); 
      var sqlParameter3 = sqlInsert.Parameters.Add("@semester", SqlDbType.NVarChar); 
      var sqlParameter4 = sqlInsert.Parameters.Add("@weekbatch", SqlDbType.NVarChar); 
      var sqlParameter5 = sqlInsert.Parameters.Add("@subject", SqlDbType.NVarChar); 
      var sqlParameter6 = sqlInsert.Parameters.Add("@facultyname", SqlDbType.NVarChar); 
      var sqlParameter7 = sqlInsert.Parameters.Add("@facultyid", SqlDbType.NVarChar); 
      var sqlParameter8 = sqlInsert.Parameters.Add("@WeekMonth", SqlDbType.NVarChar); 

      con2.Open(); 
      // try 
      //{ 
       for (var i = 0; i <= datedif1; i++) 
       { 
        var consecutiveDate = fromdate.AddDays(i); 

        sqlParamater.Value = consecutiveDate; 
        sqlParameter1.Value = batch1; 
        sqlParameter2.Value = dayweek; 
        sqlParameter3.Value = semester; 
        sqlParameter4.Value = weekbatch; 
        sqlParameter5.Value = subject; 
        sqlParameter6.Value = faculty; 
        sqlParameter7.Value = facultyid; 
        sqlParameter8.Value = weekmonth; 

        int s = sqlInsert.ExecuteNonQuery(); 
       } 

      } 

回答

2

我承認沒有測試這一點,但提供的錯誤消息,子查詢:

SELECT 
    @datedif, 
    @batch, 
    -- and so on 
    @weekMonth 
) AS temp 

需要有列名定義爲價值來源於一個變量。

這將是:

SELECT 
    @datedif as datedif, 
    @batch as batch, 
    -- and so on 
    @weekMonth as weekMonth 
) AS temp 
+0

感謝增添了不少的ELSE ...此代碼工作。 –

+0

如何在彈出窗口中選擇相同的日期和批次時獲取警報消息。 –

1

你所得到的錯誤說明了一切。這是因爲你的內部選擇表temp需要定義所有的列名。同樣在WHERE NOT EXISTS (SELECT datelist中,您使用的表名稱爲datelist作爲列名稱。

要解決您的錯誤,請像這樣寫你的sql。

INSERT INTO datelist ([datedif],[batch],[daywk],[semester],[weekbatch],[subject],[facultyname],[facultyid],[WeekMonth]) 
SELECT * FROM 
(
    SELECT @datedif as datedif,@batch as batch,@daywk AS batch,@semester AS semester,@weekbatch AS weekbatch,@subject AS subject,@facultyname AS facultyname,@facultyid AS facultyid,@weekMonth AS weekMonth 
) AS temp 
WHERE NOT EXISTS (SELECT * from datelist where [email protected] and [email protected]); 

可以交替寫你的查詢中IF NOT EXISTS(SELECT){Insert}格式如下圖所示。如果你需要捕捉時紀錄數據庫已經存在,你可以用RAISERROR/THROW

IF NOT EXISTS(SELECT * from datelist where [email protected] and [email protected]) 
BEGIN 
    INSERT INTO datelist ([datedif],[batch],[daywk],[semester],[weekbatch],[subject],[facultyname],[facultyid],[WeekMonth]) 
    VALUES (@datedif,@batch,@daywk,@semester,@weekbatch,@subject,@facultyname,@facultyid,@weekMonth) 
END 
ELSE 
BEGIN 
    RAISERROR('Record already exists in the table',16,1); 
END 
+0

以上答案正在爲我工​​作。感謝您的建議。 –

+0

沒問題,我們在這裏幫忙。我的回答是更接近相同查詢的另一種方式。 – ughai

+0

謝謝......我想在選擇相同的日期和批次時獲得警報消息。如何做到這一點?我嘗試嘗試catch方法,但它不工作。 –