Как вставить в файл DBF (foxpro)

У меня есть следующий код в asp.net:

using (OleDbCommand command = dbConnW.CreateCommand())
{
    string CreateTableK = null;
    CreateTableK += "Create Table DSKKAR00 (DSK_ID c(10),DSK_KIND N(1),MON_PYM C(3))";
    OleDbCommand cmdCreateTable = new OleDbCommand(CreateTableK, dbConnW);
    cmdCreateTable.ExecuteNonQuery();
    System.Text.StringBuilder sb = new  System.Text.StringBuilder();
    sb.Append(WorkRoomNo + ","); 
    sb.Append("1,");
    sb.Append(",");
    OleDbCommand cmd3 = new OleDbCommand("Insert into DSKKAR00 (DSK_ID,DSK_KIND,MON_PYM) Values (" + sb.ToString() + ")", dbConnW);
    cmd3.ExecuteNonQuery();

Но у меня следующая ошибка:

Ошибка синтаксиса


person Masoud Zayyani    schedule 08.02.2012    source источник
comment
Я думаю, что после адреса в строке ...... помогите мне, пожалуйста   -  person Masoud Zayyani    schedule 08.02.2012
comment
WorkRoomNo — постоянное целое число   -  person Masoud Zayyani    schedule 08.02.2012


Ответы (2)


В дополнение к тому, что предложил Крис, вы начинаете CREATE TABLE со строковой переменной NULL, а затем добавляете к ней +=. Насколько я помню, NULL += "anystring" останется нулевым значением... Возможно, вы тоже столкнетесь с ошибкой.

Хотя VFP на самом деле не подвержен SQL-инъекциям, как другие механизмы SQL, его хорошая привычка выполнять параметризацию. Когда вы это сделаете, используйте "?" в качестве заполнителя для значения, которое вы хотите вставить, и добавьте параметры в той же последовательности, что и "?" представлять.

string CreateTableK = 
   "Create Table DSKKAR00 (DSK_ID c(10),DSK_KIND N(1),MON_PYM C(3))";     

OleDbCommand cmdCreateTable = new OleDbCommand(CreateTableK, dbConnW);
cmdCreateTable.ExecuteNonQuery();     

string MyInsert = 
   "insert into DSKKAR00 ( dsk_id, dsk_kind, mon_pym ) values ( ?, ?, ? )";
OleDbCommand cmd3 = new OleDbCommand( MyInsert, dbConnW);
cmd3.Parameters.AddWithValue( "parmSlot1", WorkRoomNo );
cmd3.Parameters.AddWithValue( "parmSlot2", 1);
cmd3.Parameters.AddWithValue( "parmSlot3", 'tst' ); // or whatever variable to put
cmd3.ExecuteNonQuery(); 
person DRapp    schedule 08.02.2012

Во-первых, каждый раз, когда у вас возникает ошибка, обычно лучше опубликовать все сообщение об ошибке, которое вы получите.

Кроме того, при попытке отладки проблемы с запросом вы должны отправить фактический запрос на ваш сервер/базу данных и проверить его. Таким образом, вы можете найти различные проблемы, такие как слишком много запятых.

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

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

insert into DSKKAR00(DSK_ID, DSK_KIND, MON_PYM) VALUES( X,1, ,)

где X — значение вашей переменной WorkRoomNo.

Очевидно, что это недопустимый синтаксис и приведет к ошибке, которую вы видели. Запятые указывают на то, что передается 4 значения, но запрос на вставку идентифицирует только 3 столбца.

Следующая проблема связана с самими определениями столбцов. Первый столбец этой таблицы — c(10); третий - c(3). Я немного заржавел, но разве это не поля символов?

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

Что приводит нас к последней проблеме: не используйте конкатенацию строк для построения запросов. Используйте параметризованные запросы

person NotMe    schedule 08.02.2012