DataTable всегда возвращает пустые значения - PullRequest
0 голосов
/ 17 февраля 2011

Я новичок в .NET, и мне нужно написать функцию, которая выполняет хранимую процедуру и возвращает DataTable.

мой SqlConnection уже инициализирован, и во время работы в отладчике я вижу, что DataAdapter возвращает значения, но мой DataTableпусто.

 public DataTable ExecStoredProcedure(String spName, String uId)
        {
            DataTable dt = new DataTable();
            try
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(spName, conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@UnitIDList", uId);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }
            catch (SqlException ex)
            {
                throw new Exception(ex.StackTrace + ex.Message);
            }
            finally
            {
                conn.Close();
            }

            return dt;
        }

Пожалуйста, помогите.

Ответы [ 2 ]

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

У меня была такая же проблема с SqlDataAdapter, возвращавшим пустой DataTable как результат, но в моем случае причина была в том, что у меня было два параметра ("CheckDate1" и "CheckDate2", хранимая процедура не между прочим) объявлено как тип SqlDbType.DateTime.Однако кто-то очень умный определил их как VARCHAR(10), что я упустил в начале.

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

Надеюсь, это может быть полезно для кого-то другого.

G.

1 голос
/ 17 февраля 2011

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

Когда вы переходите через свой код в отладчике и попадаете в строку:

da.Fill(dt);

дайте ему поработать, прежде чем будет выполнена следующая строка, проверьте значение dt.Rows.Count в окнах Watch или Immediate. Какое число сообщается?

Если dt.Rows.Count > 0, то вам нужно проверить код, в котором вы что-то делаете, с помощью DataTable, получаемого из вашего метода - вот в чем проблема.

Если dt.Rows.Count ==0, то он не возвращает никаких данных из сохраненного процесса - (кажется, это не та проблема, которая у вас есть), и вам нужно будет посмотреть на SQL внутри вашего sproc. Посмотрите и напишите, что вы найдете ...

...