2010-09-30 3 views
2
string date = p_text_data.Text; 
string sql = @"INSERT INTO Warehouse (title,count,price,date) "; 
try 
{ 
    using (SqlConnection connection = ConnectToDataBase.GetConnection()) 
    { 
     SqlCommand command = new SqlCommand(sql, connection); 
     for (int i = 0; i < mdc.Count; i++) 
     { 
      sql += "SELECT @title" + i + ",@count" + i + ",@price" + i + ",@date" + i + " "; 
      command.Parameters.AddWithValue("@title" + i, mdc[i].Title); 
      command.Parameters.AddWithValue("@count" + i, mdc[i].Count); 
      command.Parameters.AddWithValue("@price" + i, mdc[i].Price); 
      command.Parameters.AddWithValue("@date" + i, Conver_Data(date)); 
      if (mdc.Count-1 != i) 
       sql += "UNION ALL "; 
     } 
     sql += " ;"; 
     connection.Open();// *sql 
     string id_Partner = command.ExecuteScalar().ToString(); 
    } 
} 
catch (SqlException se) 
{ 
    MessageBox.Show(se.Message); 
} 

* sql = "INSERT INTO Warehouse (название, счет, цена, дата) SELECT @ title0, @ count0, @ price0, @ date0 UNION ALL SELECT @ title1, @ count1, @ price1, @ date1;"Как добавить несколько строк в таблицу?

Затем он летит Исключением

Неправильный синтаксис около ')'

уточнить - кол - INT, цена - двойной, дата - дата

, что я делаю неправильно?

редактировать: Таблица

CREATE TABLE [dbo].[Warehouse] (
    [ID] int IDENTITY(1, 1) NOT NULL, 
    [title] char(30) COLLATE Cyrillic_General_CI_AS NULL, 
    [count] int NULL, 
    [price] float NULL, 
    [date] datetime NULL, 
    CONSTRAINT [PK__Warehous__3214EC277F60ED59] PRIMARY KEY CLUSTERED ([ID]) 
) 
ON [PRIMARY] 
GO 

Я использовал SQL Server 2008

+0

Какую версию SQL Server вы используете? –

+0

Запрос работает отлично для меня в SQL Server 2008. – Timwi

+0

Я обновил свой ответ – garik

ответ

3

Проблема заключается в том, что вы никогда не обновляет команду SQL текст command объекта с чем-либо после того, как «) ». Просто потому, что вы обновляете переменную sql, это не означает, что объект SqlCommand будет видеть это обновление.

(Другая проблема, что вы столкнетесь в том, что вы ничего не возвращаются из этого запроса, так что вы не сможете использовать ExecuteScalar().)

Попробуйте вместо этого:

string date = p_text_data.Text; 
string sql = @"INSERT INTO Warehouse (title,count,price,date) "; 
try 
{ 
    using (SqlConnection connection = ConnectToDataBase.GetConnection()) 
    { 
     SqlCommand command = new SqlCommand(sql, connection); 
     for (int i = 0; i < mdc.Count; i++) 
     { 
      sql += "SELECT @title" + i + ",@count" + i + ",@price" + i + ",@date" + i + " "; 
      command.Parameters.AddWithValue("@title" + i, mdc[i].Title); 
      command.Parameters.AddWithValue("@count" + i, mdc[i].Count); 
      command.Parameters.AddWithValue("@price" + i, mdc[i].Price); 
      command.Parameters.AddWithValue("@date" + i, Conver_Data(date)); 
      if (mdc.Count-1 != i) 
       sql += "UNION ALL "; 
     } 
     sql += " ;"; 
     command.CommandText = sql; // Set your SQL Command to the whole statement. 
     connection.Open();// *sql 
     command.ExecuteNonQuery(); // Execute a query with no return value. 
    } 
} 
catch (SqlException se) 
{ 
    MessageBox.Show(se.Message); 
} 
0

Вы пытаетесь использовать String sql в качестве ссылочного типа, хотя это ссылочный тип, это особый случай, когда он действует как тип значения. Линия

sql += "SELECT @title" + i + ",@count" + i + ",@price" + i + ",@date" + i + " ";

по-видимому, добавление к sql, но на самом деле он создает новую строку, хранящуюся в другом месте в памяти String, что вы передаёте в SqlCommand.

Если массив массивный, вы можете увидеть преимущество в производительности, используя класс StringBuilder, чтобы построить свою строку, а затем назначьте ее объекту SqlCommand после его создания.

В любом случае вам необходимо назначить его SqlCommand.CommandText после того, как у вас будет полный SQL в переменной sql.

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