Asp插入错误

时间:2014-05-23 12:29:46

标签: c# asp.net .net sql-server

我是Asp.net的新手,我尝试从文件读取并存储到数据库      文件格式为:(阅读是测试,它很好)

       0101;23/05/2014
       0602;23/05/2014
       0301;23/05/2014
       1103;23/05/2014
       0201;23/05/2014
       1704;23/05/2014
       ***************


        string[] lines = System.IO.File.ReadAllLines(@"C:\Users\user\Desktop\file.txt");
        SqlConnection connexion = new SqlConnection(@"Data Source=               (LocalDB)\v11.0;AttachDbFilename=C:\Users\user\Desktop\controle\miniprojet\miniprojet\App_Data\ariche.mdf;Integrated Security=True"); 
        SqlCommand command = connexion.CreateCommand();
        String requete = "INSERT INTO commande VALUES(@idpr,@date)";
        SqlParameter paramidprod;
        SqlParameter paramdate;
        connexion.Open(); 
        res.Text="Contents of file.txt = ";
        foreach (string line in lines)
        {
           if (line.Contains('*')) break;
           String[] l = line.Split(';');
           paramidprod=new SqlParameter("@idpr", line.Substring(0,2));
           paramdate = new SqlParameter("@date", l[1]);
           command.Parameters.Add(paramidprod);
           command.Parameters.Add(paramdate);
           command.CommandText = requete;
           command.ExecuteNonQuery();
           res.Text += "<br>" + l[1] +"   "+ line.Substring(0, 2);
        }
        connexion.Close();
        connexion.Dispose();

当我运行该程序时,我遇到了问题:

The variable name '@idpr' has already been declared. Variable names must be unique 
within a query batch or stored procedure. 

你能否识别我失去的错误

2 个答案:

答案 0 :(得分:2)

循环,每次循环运行时添加新参数。因此,第二次和随后的呼叫将失败。

每个循环设置新的命令参数,或者只创建一次参数,然后在每个循环中重新分配它们。

这是第二个选项 - 重用相同的参数 - 它在循环场景中的性能会比你看起来更高:

    var connexion = new SqlConnection(@"Data Source=..."); 
    var command = connexion.CreateCommand();
    var requete = "INSERT INTO commande VALUES(@idpr,@date)";
    // I've assumed the types - double check
    var paramidprod = new SqlParameter("@idpr", SqlDbType.VarChar);
    var paramdate = new SqlParameter("@date", SqlDbType.DateTime);
    command.Parameters.Add(paramidprod);
    command.Parameters.Add(paramdate);
    command.CommandText = requete;
    connexion.Open(); 

    foreach (string line in lines)
    {
       if (line.Contains('*')) break;
       String[] l = line.Split(';');
       paramidprod.Value = line.Substring(0,2);
       paramdate.Value = l[1];
       command.ExecuteNonQuery();
    }
    connexion.Close();
    connexion.Dispose();

如果要插入大量的记录,还可以考虑每1000次插入提交事务。

答案 1 :(得分:2)

请注意,在每次迭代中,您都将相同的参数插入SqlCommand对象。在此之前你需要清除以前的那些:

foreach (string line in lines)
{
    command.Parameters.Clear();