Ошибка сервера в ExecuteSPDataTable: как написать функцию, которая может использовать процедуры и параметры хранилища и возвращать DataTable? - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь запустить следующий код, в основном используя SQL-запрос, который находится в моей базе данных доступа, добавляя к нему параметры и получая из него данные:

    string spSQL = "spFindFullScheduleEvents";
    ArrayList prmList;
    OleDbParameter prm;
    int userID = (int)Session["UserID"];
    if (userID < 0 || Session["UserID"] == null)
        userID = 0;
    int i = 1;
    prmList = new ArrayList();

    prm = new OleDbParameter("IDUser", OleDbType.Integer);
    prm.Value = userID;
    prmList.Add(prm);

    DataTable dt = DoQueries.ExecuteSPDataTable(spSQL, prmList);

Функция DoQueries:

 public static DataTable ExecuteSPDataTable(string strSQL, ArrayList prmList)
{
    DataTable dt = new DataTable();
    OleDbDataAdapter adp = new OleDbDataAdapter(strSQL, strConnection);
    foreach (OleDbParameter prm in prmList)
    {
        adp.InsertCommand.Parameters.Add(prm);
    }
    adp.Fill(dt);
    return dt;
}

но по какой-то причине я получаю «Ссылку на объект, не установленную для экземпляра объекта», при попытке добавить параметры, думая, что это был Session ["UserID"], который вызывал проблему,но даже когда я попытался ввести обычное значение типа int (30), проблема все еще возникает в этой строке:

  adp.InsertCommand.Parameters.Add(prm);

Команда SQL работает следующим образом:

   SELECT *
   FROM tblFullSchedule
   WHERE IDUser = [@IDUser];

Я должен такжеОтметим, что я использую это для школьного проекта, и, к сожалению, здесь все устарело, класс DoQueries был создан моим учителем, поэтому я не знаю, является ли это проблемой с ее кодом, или я делаю что-то не так,Ранее я выполнял аналогичную функцию с именем ExecuteDataTable, потому что мне не нужно было никаких параметров, которые работали идеально.

После завершения записи у меня есть подозрение, что ExecuteSPDataTable принимает команду SQL, а не хранимую процедуру, поэтому возникает ошибка.если мои подозрения верны, то мне бы очень хотелось помочь в написании функции DoQueries, которая принимает процедуру сохранения, потому что я новичок в SQL / OleDB и не знаю, как это сделать.

1 Ответ

0 голосов
/ 04 февраля 2019

Итак, я нашел способ исправить это - с помощью этого устаревшего кода, если кто-то окажется в такой же ситуации.
Я не могу поверить, что я не понял этого - но решение было изменить InsertCommandв SelectCommand ..

public static DataTable ExecuteSPDataTable(string strSQL, ArrayList prmList)
{
    DataTable dt = new DataTable();
    OleDbDataAdapter adp = new OleDbDataAdapter(strSQL, strConnection);

    foreach (OleDbParameter prm in prmList)
    {
        adp.SelectCommand.Parameters.Add(prm);
    }
    adp.Fill(dt);
    return dt;
}

и измените строку SQL на:

 string strSQL = "SELECT * FROM tblFullSchedule WHERE IDUser = @IDUser";

Вместо имени запроса .... Теперь я серьезно должен обновить этот код ..

...