2016-02-04 2 views
0

Я пытаюсь вставить данные из datGridView в SQL Server (я загружаю данные из файла Excel). Но я получаю ошибку первичного ключа, что она не должна быть нулевой.C# dataGridView to SQL (insert)

И если я использую что-то вроде этого:

cmd.Parameters.AddWithValue("@id", 1012); 

возвращает дубликат ключа ошибки ...

Это мой код:

private void btnTest_Click(object sender, EventArgs e) 
{ 
     int stCol = dataGWseznam.Columns.Count; 
     string[] poljeNaslovov = new string[dataGWseznam.Rows.Count]; 

     for (int i = 0; i < stCol; i++) 
     { 
      poljeNaslovov[i] = Convert.ToString(dataGWseznam.Columns[i].HeaderText); 

     } 

     string[] poljeNaslovovAfna = new string[dataGWseznam.Rows.Count]; 

     for (int i = 0; i < stCol; i++) 
     { 
      poljeNaslovovAfna[i] ="@" + Convert.ToString(dataGWseznam.Columns[i].HeaderText); 

     } 

     string msg1 = String.Join(",", poljeNaslovov.Where(s => !string.IsNullOrEmpty(s))); 
     string msg2 = String.Join(",", poljeNaslovovAfna.Where(s => !string.IsNullOrEmpty(s))); 

     try 
     { 
      foreach (DataGridViewRow row in dataGWseznam.Rows) 
      { 
       string constring = @"MY DATA SOURCE"; 

       using (SqlConnection conn = new SqlConnection(constring)) 
       { 
        using (SqlCommand cmd = new SqlCommand("INSERT INTO Monitoring(id,date,time) VALUES(@id,@date,@time)", conn)) 
        { 
         cmd.Parameters.AddWithValue("@id", 1012); 
         cmd.Parameters.AddWithValue("@date", row.Cells["date"].Value); 
         cmd.Parameters.AddWithValue("@time", row.Cells["time"].Value); 

         conn.Open(); 
         cmd.ExecuteNonQuery(); 
         conn.Close(); 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      //handle exception 
      MessageBox.Show(ex.Message); 
     } 
     MessageBox.Show("Done."); 
} 

Как я могу решить эту проблему?

+1

вы используете один и тот же идентификатор для всех строк cmd.Parameters.AddWithValue ("@ id", 1012); Вы должны реализовать somthing для allcate diffrent primarykey –

ответ

0

Первая проблема возникает из-за того, что, по-видимому, вы не установили первичный ключ (он не установлен как IDENTITY на вашей таблице).

Проверьте это, чтобы увидеть, как настроить таблицу для автоматического увеличения ID: https://msdn.microsoft.com/en-us/library/ms186775(v=sql.120).aspx

«Вторая» ошибка происходит потому, что идентификатор должен быть уникальным на вашем столе. Таким образом, вы должны сделать идентификатор полем идентификации.

(я бы рекомендовал вам создать новую колонку на вашем столе, и уронить текущий Вы можете найти, как сделать это здесь:. https://social.msdn.microsoft.com/Forums/sqlserver/en-US/04d69ee6-d4f5-4f8f-a115-d89f7bcbc032/how-to-alter-column-to-identity11?forum=transactsql)

После этого содержания на вашем столе, вы должны удалить это:

cmd.Parameters.AddWithValue("@id", 1012) 

и изменить ваше заявление вставки из этого:

INSERT INTO Monitoring(id,date,time) VALUES(@id,@date,@time) 

к этому:

INSERT INTO Monitoring(date,time) VALUES(@date,@time) 

Потому что, так как ваш столбец идентификатора будет личным, вам не нужно будет его предоставлять, поскольку он автоматически обеспечит вам прирост.

Надеюсь, это поможет!

+0

Хорошо, спасибо, что исправлено tha tproblem, но теперь я получаю это: Параметрированный запрос '(@date nvarchar (4000), @ time nvarchar (4000)' ожидает параметр ' @date ', который не был отправлен , но данные добавляются в базу данных .... – mheonyae

+0

Были ли записаны все данные? Я имею в виду, возможно, значение, указанное в переменной даты, было пустым. В этом случае вы должны преобразовать его в присваиваемые типы – Octanic

+0

Да все это, в основном это сообщение об ошибке, я мог удалить сообщение из исключения, но это просто скроет ошибку ... – mheonyae