2015-05-08 170 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方法,但它不工作。 –