Параметр ADODB не отправляет входное значение - PullRequest
0 голосов
/ 20 декабря 2011

Я потратил больше времени, чем хотел бы упомянуть, пытаясь разобраться с этим.Я пытаюсь вызвать хранимую процедуру с помощью команды adodb выполнить в C #.Я делаю то же самое для всех своих параметров, но первый всегда отправляет «system.object» вместо значения, которое я хочу ввести.Я был бы очень признателен за любую помощь.

Вот код:

ADODB.Connection con;
        ADODB.Command com;
        ADODB.Recordset rst;
        ADODB.Parameter prm;

        con = null;
        con = new ADODB.Connection();
        con.Provider = "SQLOLEDB.1";
        con.ConnectionString = "Description=MyDB;IntegratedSecurity=SSPI;Trusted_Connection=Yes;APP=MyApp;WSID=MyServer;DATABASE=MyDB";
        con.Open(con.ConnectionString , null, null, 0);

        com = null;
        com = new ADODB.Command();
        com.CommandText = "MyStoredProc";
        com.CommandType = ADODB.CommandTypeEnum.adCmdStoredProc;
        com.NamedParameters = true;
        com.Prepared = false;
        com.Name = ("MyStoredProc" + System.DateTime.Now.ToString("yyyyMMddHHmmssffff"));

        prm = null;


        //Location parameter
        prm = com.CreateParameter("@LocationNameIn", DataTypeEnum.adVarChar, ParameterDirectionEnum.adParamInput, 80, Convert.ToString("London"));
        com.Parameters.Append(prm);
        prm.Value = Convert.ToString("London");
        prm = null;

        //parameter
        prm = com.CreateParameter("@Time", DataTypeEnum.adDBTimeStamp, ParameterDirectionEnum.adParamInput, 0, Convert.ToDateTime("01/12/2011 00:20"));
        com.Parameters.Append(prm);
        prm = null;

        //parameter
        prm = com.CreateParameter("@Param3", DataTypeEnum.adDouble, ParameterDirectionEnum.adParamInput, 0, 1000.0);
        com.Parameters.Append(prm);
        prm = null;

        //parameter
        prm = com.CreateParameter("@Param4", DataTypeEnum.adDouble, ParameterDirectionEnum.adParamInput, 0, -999);
        com.Parameters.Append(prm);
        prm = null;

        //parameter
        prm = com.CreateParameter("@Param5", DataTypeEnum.adDouble, ParameterDirectionEnum.adParamInput, 0, 245.9);
        com.Parameters.Append(prm);
        prm = null;

        //parameter
        prm = com.CreateParameter("@Param6", DataTypeEnum.adDouble, ParameterDirectionEnum.adParamInput, 0, -999);
        com.Parameters.Append(prm);

        prm = null;

        //parameter
        prm = com.CreateParameter("@Param7", DataTypeEnum.adVarChar, ParameterDirectionEnum.adParamInput, 20, "South");
        com.Parameters.Append(prm);
        prm = null;

        //parameter
        prm = com.CreateParameter("@Param8", DataTypeEnum.adDouble , ParameterDirectionEnum.adParamInput, 0, 0);
        com.Parameters.Append(prm);
        prm = null;

        // parameter
        prm = com.CreateParameter("@Param9", DataTypeEnum.adVarChar, ParameterDirectionEnum.adParamInput, 120, "BlahdiblahPC");
        com.Parameters.Append(prm);
        prm = null;


        com.ActiveConnection = con;
        object oRA = new object();
        object oPRM = new object();
        rst = com.Execute(out oRA, ref oPRM, (int)ExecuteOptionEnum.adExecuteRecord);

Когда я делаю трассировку в базе данных, я получаю следующее:

exec MyStoredProc @ LocationNameIn = 'System.Object', @ Time = '2011-12-01 00:20:00', @ Param3 = 1000, @ Param4 = -999, @ Param5 = 245.90000000000001, @ Param6 = -999,@ Param7 = 'Юг', @ Param8 = 0, @ Param9 = 'BlahdiblahP C'

Таким образом, все параметры работают нормально, кроме первого.Я поиграл с типами данных для параметра и с параметрами выполнения для метода execute команды, но на самом деле понятия не имею, с чего начать.

Заранее спасибо !!!

1 Ответ

1 голос
/ 20 декабря 2011

Я Подозреваю Проблема в том, что с этим связано:

object oRA = new object();
object oPRM = new object();
rst = com.Execute(out oRA, ref oPRM, (int)ExecuteOptionEnum.adExecuteRecord);

Для начала вам не нужно присваивать значение oRA здесь - это параметр out, поэтому его не нужно обязательно назначать. У меня нет опыта работы с ADODB.Command, но я сильно подозреваю, что часть System.Object взята из oPRM. В качестве эксперимента попробуйте:

object oRA;
object oPRM = "Some string";
rst = com.Execute(out oRA, ref oPRM, (int)ExecuteOptionEnum.adExecuteRecord);

... и посмотрите, является ли первый параметр "Некоторая строка". Интересно, если , если указать параметр в вызове Execute, он перезаписывает первый параметр, сохраненный в коллекции параметров. Если это так, вы можете установить значение null и посмотреть, игнорируется ли это - я не знаю достаточно о ADODB, чтобы сказать, но я бы поэкспериментировал. (А согласно комментарию Марка, я бы предложил вместо этого использовать SqlConnection.)

...