2012-05-24 5 views
0

У меня проблема с оператором INSERT. Я получаю данные из gridviev и она отлично работает, но я не могу вставить их в таблицуОператор INSERT не вставляет данные в таблицу

private void button3_Click(object sender, EventArgs e) 
{ 
    int amorplanid = 0; 
    int idn = 0; 
    DateTime datum; 
    double interest = 0; 
    double principal = 0; 
    double payment = 0; 
    double newprincipal = 0; 

    string nizz = ""; 
    string[] niz= new string[7]; 
    for (int x = 0; x < dataGridView1.Rows.Count-1; x++) 
    { 
     for (int j = 0; j < dataGridView1.Rows[x].Cells.Count; j++) 
     { 
      nizz += dataGridView1.Rows[x].Cells[j].Value.ToString()+"."; 
     } 
     niz = nizz.Split('.'); 

     amorplanid = System.Convert.ToInt32(niz[0]); 
     idn = System.Convert.ToInt32(niz[1]); 
     // datum = System.Convert.ToDateTime(niz[2]); 
     datum = DateTime.Now; 
     interest = System.Convert.ToDouble(niz[3]); 
     principal = System.Convert.ToDouble(niz[4]); 
     payment = System.Convert.ToDouble(niz[5]); 
     newprincipal = System.Convert.ToDouble(niz[6]); 

     String insert = @"INSERT INTO AmortPlanCoupT(ID, AmortPlanID, CoupDate, Interest, Principal, Payxment, NewPrincipal) VALUES (" + idn + "," + amorplanid + "," + datum + "," + (float)interest + "," + (float)principal + "," + (float)payment + "," + (float)newprincipal + ")"; 
     SqlConnection myconn = new SqlConnection(conn); 
     // String MyString = @"INSERT INTO Employee(ID, FirstName, LastName) VALUES(2, 'G', 'M')"; 
     try 
     { 
      myconn.Open(); 
      SqlCommand cmd = new SqlCommand(insert, myconn); 
      cmd.ExecuteNonQuery(); 
      myconn.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 

    label14.Text = niz[0]; 
} 

Я создал консольное приложение для Windows для теста:

У меня есть таблицы test с двумя колоннами id (int) , leto (float);

SqlConnection MyConnection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\App_Data\Database1.mdf;Integrated Security=True;User Instance=True"); 

try 
{ 
    MyConnection.Open(); 

    String MyString = @"INSERT INTO test(id, leto) VALUES(2, 2)"; 
    SqlCommand MyCmd = new SqlCommand(MyString, MyConnection); 

    MyCmd.ExecuteScalar(); 
    MyConnection.Close(); 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.ToString()); 
} 

Я пробовал разные вещи, чтобы писать данные на стол, и просто не могу их достать.

+4

Вы не должны ** ** никогда сцепить вместе образуют SQL утверждение - [использовать ** параметризованные запросы ** вместо] (http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson06.aspx) - ** всегда, никаких исключений! ** –

+0

пользователь ... вы случайно запустить SQL Profiler, чтобы убедиться, что вы на правильном подключении и т. д.? Раньше я делал подобное, и был связан с неправильным сервером. –

+1

@marc_s: Есть исключения для каждого правила (включая этот). Но я согласен. Этот код уязвим для SQL-инъекции. –

ответ

-1

Перед тем, как идти дальше, вы должны переписать свой код для использования параметров вместо конкатенации строк.

+0

Привет .. Я новый, чтобы C# – user1415320

+0

тоже не работает с параметрами – user1415320

5

Как я уже говорил на этом сайте - весь код User Instance и AttachDbFileName = ошибочен - в лучшем случае! Visual Studio будет копировать файлы .mdf и , скорее всего,, ваш INSERT работает просто отлично - но вы просто смотрите на неверный файл .mdf в конце!

Если вы хотите придерживаться такого подхода, попробуйте положить точку останова на вызов myConnection.Close(), а затем проверить файл .mdf с помощью SQL Server Mgmt Studio Express. Я почти уверен, что ваши данные есть.

реальное решение на мой взгляд, было бы

  1. установки SQL Server Express (и вы уже сделали это в любом случае)

  2. установки SQL Server Management Studio Express

  3. создать свою базу данных в SSMS Express, введите логическое имя (например, Database1)

  4. подключиться к нему с помощью своего логического базы данных (данный при создании на сервере) - и не вмешиваться в физические файлы базы данных и пользовательские экземпляры. В этом случае строка подключения будет что-то вроде:

    Data Source=.\SQLEXPRESS;Database=Database1;Integrated Security=True 
    

    и все остальное точно же, как раньше ...

Смежные вопросы