ExecuteNonQuery не получается выполнить...

catsy
Дата: 16.09.2005 11:29:32
Хочу обновить данные с помощью этого метода. На сервере есть отлаженная простейшая процедура, которая делает insert в базу.
При попытке запустить этот метод (предварительно открывается транзакция, и все, как описано в хелпе), он возвращает кол-во строк -1. После этого транзакция коммитится. Иду в базу (IBExpress), а там ничего нет. Тогда я там нажимаю кнопку Commit, и строка появляется!


ладно, думаю, попробую вставить текст запроса в саму команду (типа "insert into tbl (col1, col2) values ('a', 'b')" - т.е. это command.TextCommand , и при попытке выполнить возвращается ошибка 104 - "неизвестный токен insert"!

Объясните, пожалуйста, что происходит?

И еще - мне непонятно, если Command.Parameters содержит параметры, то как их вставить в текст TextCommand?
catsy
Дата: 16.09.2005 11:40:38
Да, это все с использованием провайдера .NET.
Pop
Дата: 16.09.2005 11:45:47
Ничего не понятно. Ты хранимку запускаешь или как? Приведи текст программы. Ошибка 104 указывает на то, что скорее всего у тебя кривой CommandText.

Из коллекции параметров не надо ничего переносить в CommandText. Надо заполнять Parameters[].Value
Pop
Дата: 16.09.2005 11:50:43
catsy
Иду в базу (IBExpress), а там ничего нет. Тогда я там нажимаю кнопку Commit, и строка появляется!
Если строка появляется, то чего тебе еще надо? Ты попробуй просто закладочку закрыть/открыть, может тоже появится. IBExpert ведь не знает, что данные обновить надо.
catsy
Дата: 16.09.2005 11:59:56
Ну текст я сейчас не могу привести полный, т.к. на работе, а в CommandText тот текст, что приведен "insert... " - непосредственно в SQL едиторе он прекрасно выполнялся, здесь же ругается. В первом случае была попытка запустить хранимую процедуру. Хорошо, если в базу записывалась строка, то почему возвращаемый результат был равен минус единице? Мне же надо узнать, сколько строк он записал успешно.
catsy
Дата: 16.09.2005 12:03:09
автор
Из коллекции параметров не надо ничего переносить в CommandText. Надо заполнять Parameters[].Value


Я так и делаю, заполняю эту коллекцию параметрами. Просто имелось в виду, что сама коллекция принадлежит команде. А потом я хочу, указав текст типа "insert....", чтобы он сам подставил в этот текст имеющиеся параметры. В хелпе мне удалось найти фразу, что CommandText позволяет использовать именованные параметры, и там был приведен пример вроде
"select a from b where c = @c". Мне подумалось, что @c - это и есть имя параметра, который находится в коллекции, что он сам подставляет его значение. Но у меня этот номер не прокатил. наверное, что-то не так понимаю.
Pop
Дата: 16.09.2005 12:39:38
catsy
Ну текст я сейчас не могу привести полный, т.к. на работе

Если ты сам не знаешь, что у тебя написано, то как остальные догадаются?
catsy
Хорошо, если в базу записывалась строка, то почему возвращаемый результат был равен минус единице?
Так и должно быть. В документации на ExecuteNonQuery это описано.

catsy
Я так и делаю, заполняю эту коллекцию параметрами..

Какую коллекцию? Если у тебя действительно тот мелкий запрос, то там нет ни одного параметра.

catsy
Мне подумалось, что @c - это и есть имя параметра

Так и есть.
catsy
Но у меня этот номер не прокатил. наверное, что-то не так понимаю.
RTFM FbParameterCollection
catsy
Дата: 16.09.2005 13:07:45
автор
Так и должно быть. В документации на ExecuteNonQuery это описано.

Там сказано:
For UPDATE, INSERT, and DELETE statements, the return value is the number of rows affected by the command. For all other types of statements, the return value is -1.

Это имеется в виду, что если сам текст содержит эти слова, то тогда будет число строк, а если он вызывает процедуру, которая вставляет, удаляет или обновляет, то тогда минус 1, так, что ли?
Если так, то это полная фигня. Чем принципиально отличается непосредственное выполнение какого-то выражения от выполнения хп, которая делает то же самое.


итак, там было вот что:
FbConnection myConnection = new FbConnection(connectionString);
myConnection.Open();

FbCommand myCommand = new FbCommand();
FbTransaction tran;
myTrans = myConnection.BeginTransaction();

myCommand.Connection = myConnection;
myCommand.Transaction = tran;

try
{
    myCommand.CommandText = "pr_New_Proc"; //название процедуры, кот вставляет данные
    myCommand.CommandType = CommandType.StoredProcedure;
    int n = myCommand.ExecuteNonQuery(); // всегда -1...

    tran.Commit();
}
catch...

Что касается параметров
автор
RTFM FbParameterCollection

Там нет ни одного примера! И нигде не написано, как именно следует вставлять в выражение эти параметры.
Pop
Дата: 16.09.2005 13:36:54
catsy
Если так, то это полная фигня.

Что фигня? Такая реализация? Или ты не поверил документации?

catsy
итак, там было вот что:
...

Не вижу настройки параметров (может у хранимки их нет), а так все правильно. Должно работать и, видимо, работает.

catsy
Там нет ни одного примера!

Не обманывай :) Вот делаю Copy/Paste из FirebirdNETProviderSDK.chm
myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", FbDbType.VarChar, 80).Value = "toasters";
myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", FbDbType.Integer).Value = 239;
Принцип, по-моему, ясен.
catsy
И нигде не написано, как именно следует вставлять в выражение эти параметры.

Так ты же сам написал пример вставки:
catsy
select a from b where c = @c

Так и вставляй.
catsy
Дата: 16.09.2005 13:55:07
автор
Что фигня? Такая реализация? Или ты не поверил документации?

Фигня в том, что получается, что если вставку у меня делают хранимые процедуры, то я никак не могу узнать, сколько строк они вставили, и вставили ли вообще. Может, все-таки есть какой-то другой способ?

автор
Не обманывай :) Вот делаю Copy/Paste из FirebirdNETProviderSDK.chm


Ну это-то я видела, а ты мне найди конкретный пример использования в тексте команды! И не написано, обязательно ли предварять название параметра собакой, или нет, или можно использовать какой-то другой символ?

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