2013-04-26 2 views
0

Может кто-нибудь, пожалуйста, сообщите мне, в чем проблема?Вставить команду не работает C#

Окружение:

dbConnectionString = "Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\data\db.mdf;Initial Catalog=db;Integrated Security=True" 

класса db.cs: функция

public SqlConnection conn = new SqlConnection(Properties.Settings.Default.dbConnectionString); 

public object insert(String[] inserts, String table) 
    { 
     string query  = "INSERT INTO "+table+""; 
     int dim    = inserts.Length; 
     string[] valores = new String[dim]; 
     string[] campos  = new String[dim]; 
     string camposItems = "("; 
     string valoresItems = "("; 

     for (int i = 0; i <= dim - 1; i++) 
     { 
      string[] item = inserts[i].Split('='); 
      if (i > 0) 
      { 
       campos[i]  = item[0]; 
       valores[i] = item[1]; 
       camposItems += ","+item[0]; 
       valoresItems += ",@"+item[0]; 
      } 
      else 
      { 
       campos[i]  = item[0]; 
       valores[i] = item[1]; 
       camposItems += item[0]; 
       valoresItems += "@"+item[0]; 
      } 
     } 
     camposItems += ")"; 
     valoresItems += ")"; 
     query += camposItems+" VALUES "+valoresItems; 
     query += ""; 

     try 
     { 
      using (this.conn) 
      { 
       SqlCommand cmdIns = new SqlCommand(query, this.conn); 
       int ix = 0; 
       string[] vals = new String[valores.Length]; 
       foreach (string val in valores) 
       { 
        vals[ix] = val; 
        SqlParameter parameter = new SqlParameter(); 
        parameter.ParameterName = "@" + campos[ix]; 
        parameter.SqlDbType = SqlDbType.NVarChar; 
        parameter.Direction = ParameterDirection.Input; 
        parameter.Value = val; 
        cmdIns.Parameters.Add(parameter); 
        ix++; 
       } 
       cmdIns.Connection.Open(); 
       //this.conn.Open(); 
       //object insertID = cmdIns.ExecuteNonQuery(); 
       object insertID = cmdIns.ExecuteScalar(); 
       cmdIns.Connection.Close(); 
       //this.conn.Close(); 
       if (insertID != null) 
       { 
        return insertID; 
       } 
       else 
       { 
        return false; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      return ex; 
     } 
    } 

вызов:

db db = new db(); 
String[] valores = new String[2] 
    { 
     "usuario=" + this.textBox1.Text, 
     "clave=" + this.maskedTextBox1.Text 
     }; 
object insert = db.insert(valores, "usuarios_tb"); 

, пожалуйста, помогите спасибо ...

+9

вам нужно избегать инъекции sql. использовать параметризованные запросы –

+3

Вы получаете сообщение об ошибке? – newfurniturey

+1

Похоже, у вас отсутствуют скобки для VALUES '()'. Также опубликуйте сообщение об ошибке, используйте параметризованные запросы – Habib

ответ

0

Следующий код предотвращает несколько вопросов, которые вы могли бы быть с:

  • Используя то же соединение, которое станет расположено.
  • Сложность кода была уменьшена (меньше, если/while/for), что облегчает отладку.
  • Используйте ExecuteNonQuery вместо ExecuteScalar.
  • Посоветуйте: никогда не поймайте исключение, если вы его не обрабатываете. Не используйте исключения как возвращаемое значение.
  • Посоветуйте: используйте словарь. Таким образом, вам не нужно сначала конкатенировать значения и разделить их позже. Вы также сохраняете тип значения.

Посмотрите на это:

public int insert(IDictionary<string, object> inserts, String table) 
{ 
    string query = "INSERT INTO " + table + " "; 
    List<SqlParameter> parameters = new List<SqlParameter>(); 
    string camposItems = "("; 
    string valoresItems = "("; 

    foreach(KeyValuePair<string, object> pair in inserts) 
    { 
     if (!camposItems.EndsWith("(")) 
     { 
      camposItems += ", "; 
      valoresItems += ", "; 
     } 
     camposItems += pair.Key; 
     valoresItems += "@" + pair.Key; 
     SqlParameter parameter = new SqlParameter("@" + pair.Key, pair.Value); 
     parameters.Add(parameter); 
    } 
    camposItems += ")"; 
    valoresItems += ")"; 
    query += camposItems + " VALUES " + valoresItems; 

    using(SqlConnection conn = new SqlConnection(Properties.Settings.Default.dbConnectionString)) 
    using(SqlCommand cmdIns = new SqlCommand(query, conn)) 
    { 
     cmdIns.Parameters.AddRange(parameters.ToArray()); 
     cmdIns.Connection.Open(); 
     return cmdIns.ExecuteNonQuery(); 
    } 
} 

и назвав его:

db db = new db(); 
    Dictionary<string, object> valores = new Dictionary<string, object> 
    { 
     {"usuario", this.textBox1.Text}, 
     {"clave", this.maskedTextBox1.Text}, 
    }; 
    int rowsInserted = db.insert(valores, "usuarios_tb"); 

Я знаю, это не реально ответить на ваш вопрос, но это может помочь вам и другие, чтобы узнать, что действительно идет не так. И пергамент, удалив сложность, он уже работает (из-за подключения и ExecuteNonQuery и дополнительного места после имени таблицы) :)

+0

благодарит @Martin Mulder, тестируя ... – user2322365

+0

, но на строке 'valoresItems + = pair.Key;' не должно быть так? 'valoresItems + =" @ "+ pair.Key;' – user2322365

+0

Моя ошибка. Я удалил много;). Я исправил это. –