Как добавить несколько строк в таблицу? - PullRequest
2 голосов
/ 30 сентября 2010
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

Ответы [ 2 ]

3 голосов
/ 30 сентября 2010

Проблема заключается в том, что вы никогда не обновляете текст команды 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 голосов
/ 30 сентября 2010

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

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

, кажется, добавляется к sql, но на самом деле он создает новую строку, сохраненную в другом месте в памяти по отношению к String, который вы передали SqlCommand.

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

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

...