2014-11-15 1 views
0

Можно ли указать на то, что я делаю неправильно, я получаю сообщение об ошибке обратно в SQL говоря ошибки синтаксиса около «» в строке 1Wierd двойных кавычек, вырабатываемый C# вдаваясь в синтаксис SQL

I все пробовали и, похоже, не могут избавиться от него?

Это код, я использую -

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 

     MySqlConnection conn; 
     MySqlConnection conn1; 
     bool connection = false; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 


     private void Form1_Load(object sender, EventArgs e) 
     { 

      this.toolStripStatusLabel1.Text = "Initialising"; 
      db_connect(); 

     } 





     private void db_connect() 
     { 

      string mydbconn = "server=localhost;user id=root;password=lap;database=test;"; 
      string mydbconn1 = "server=localhost;user id=root;password=lap;database=test;"; 


      try 
      { 

       conn = new MySqlConnection(mydbconn); 
       conn1 = new MySqlConnection(mydbconn1); 

       conn.Open(); 
       conn1.Open(); 
       this.toolStripStatusLabel1.Text = "Connected"; 
       connection = true; 
       if (connection == true) 
       { 
        read_data(); 
       } 

      } 

      catch (Exception ex) 
      { 
       this.toolStripStatusLabel1.Text = "WRONG"; 
       connection = false; 
      } 
     } 





     private void read_data() 
     { 


      string sql = "SELECT first_name, last_name FROM dan"; 

      MySqlCommand cmd = new MySqlCommand(sql, conn); 

      MySqlDataReader reader = cmd.ExecuteReader(); 

      while (reader.Read()) 
      { 

       string newsql = "REPLACE INTO dan1 (first_name, last_name) values"; 

       newsql += "("; 

       for (int i = 0; i < 2; i++) 
       { 

        newsql += reader.GetString(i); 

       } 

       // System.Console.WriteLine(newsql); 


       int res = 0; 
       MySqlCommand cmd1 = new MySqlCommand(newsql, conn1); 

       try 
       { 


        res = cmd1.ExecuteNonQuery(); 
        this.richTextBox1.Text = "copying"; 

       } 

       catch (MySqlException ex) 
       { 

        this.richTextBox1.Text = ex.Message; 

       } 

      } 


     } 
    } 
} 
+1

отображается Что когда вы раскомментируете строку 'System.Console.WriteLine (newsql);'? – mhawke

+1

По крайней мере, вы не закрыли круглую скобку. Добавьте строку 'newsql + =") 'после того, как ваш' for' – Alireza

ответ

2

Вы создаете запрос, который выглядит следующим образом:

REPLACE INTO dan1 (first_name, last_name) values(JohnDoe 

, когда он должен выглядеть следующим образом;

REPLACE INTO dan1 (first_name, last_name) values ('John', 'Doe') 

Для создания SQL динамически, как, что вам нужно, чтобы избежать всех строковых данных правильно, и так, что это сделано правильно, зависит от используемой базы данных. Для MySQL это будет:

string newsql = "REPLACE INTO dan1 (first_name, last_name) values ("; 
bool first = true; 
for (int i = 0; i < 2; i++) { 
    if (first) { 
    first = false; 
    } else { 
    newsql += ","; 
    } 
    newsql += "'" + reader.GetString(i).Replace("\\", "\\\\").Replace("'", "\\'") + "'"; 
} 
newsql += ")"; 

Однако, вы предпочли бы использовать параметризованный запрос вместо этого, то вам не придется беспокоиться о форматировании запроса и правильно спасаясь символы:

string newsql = "REPLACE INTO dan1 (first_name, last_name) values (@FirstName, @LastName)"; 

MySqlCommand cmd1 = new MySqlCommand(newsql, conn1); 
cmd1.Parameters.Add("@FirstName", reader.GetString(0)); 
cmd1.Parameters.Add("@LastName", reader.GetString(1)); 
+0

Я думаю, вы имеете в виду 'reader.GetString (1)' и 'reader.GetString (2)' - в противном случае +1 для параметризованных запросов. – mhawke

+0

пробовал первый код, но получил эта ошибка - ошибка синтаксиса рядом с «Chauncey''Motley») на линии 1 – SK2017

+0

секунд работал отлично, спасибо! – SK2017

0

Как минимум, я думаю, что ваш запрос может отсутствовать замыкающую скобку. Ваш код, кажется, генерировать запросы, которые выглядят следующим образом:

REPLACE INTO dan1 (first_name, last_name) values (first_name last_name 

который отсутствует закрытие ). Я также не вижу добавленных запятых для разделения элементов в предложении values, и, вероятно, сами элементы не цитируются. Попробуйте это:

string newsql = "REPLACE INTO dan1 (first_name, last_name) values"; 
newsql += "("; 
for (int i = 0; i < 2; i++) 
{ 
    newsql += reader.GetString(i); 
} 
newsql += ")"; 
// System.Console.WriteLine(newsql); 
+0

попробовал это и добавил одинарные кавычки, теперь получив ошибку «Число столбцов не соответствует количеству значений в строке 1» – SK2017

+0

Параметризованные запросы - это путь - см. http://stackoverflow.com/a/26945973/21945 – mhawke

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