2014-10-29 2 views
-1

Я пытаюсь выяснить способ выполнения следующей хранимой процедуры с использованием C#.Неверная попытка прочитать, когда нет данных с помощью Select From Where

ALTER PROCEDURE spLoadClients 
    @NetworkingChannel nvarchar(50) 
AS 
    SELECT  
     Client_Groups 
    FROM 
     ClientTable 
    WHERE   
     Networking_Channel = (@NetworkingChannel) 

    RETURN 

Хранимая процедура верна. Мне просто нужно найти правильный метод для его выполнения с помощью C#.

Вот что я пробовал:

SqlDataReader reader; 
string UpdateCommand = "spLoadClients"; 

using (SqlConnection sqlConnectionCmdString = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Shawn\Documents\Visual Studio 2010\Projects\Server\database\ClientRegit.mdf;Integrated Security=True;User Instance=True")) 
using (SqlCommand sqlCommand = new SqlCommand(UpdateCommand, sqlConnectionCmdString)) 
{ 
    sqlCommand.CommandType = CommandType.StoredProcedure; 
    sqlCommand.Parameters.Add("@NetworkingChannel", SqlDbType.NVarChar).Value = IntializedNetworks[i]; 

    sqlConnectionCmdString.Open(); 

    reader = sqlCommand.ExecuteReader(); 
    // Data is accessible through the DataReader object here. 
    IntializedPostNet[i] = reader[i].ToString(); //trying to add data from reader into an array errors here 
    sqlConnectionCmdString.Close(); 
} 

Я получаю сообщение об ошибке, что говорит

Invalid попытка чтения, когда нет данных нет.

Что я делаю неправильно?

+0

возможно дубликат [Как выполнить хранимую процедуру в пределах C# программы] (http://stackoverflow.com/questions/1260952/how-to-execute-a-stored-procedure-within-c-sharp -program) –

+0

Я дал более подробную информацию о проблеме, имеющейся у читателя. У меня нет проблем с кастомной хранимой процедурой, но что-то не так, когда я передаю правильные значения, и читатель не возвращает никаких значений. – shawn

+0

Возможно, читатель [i] 'должен читать' reader [0] '? Насколько я вижу, из 'spLoadClients' возвращен только один столбец. –

ответ

0

При использовании читателя с хранимой процедурой в сравнении с OLEDB, вы можете использовать этот метод.

var list = (from IDataRecord r in reader 
             select new 
             { 
              FieldName1 = (string)r["Network"], 
              FieldName2 = (string)r["IPAddress"].ToString(), 
              FieldName3 = (Int32)r["AsPort"], 
              FieldName4 = (string)r["ThreadLocks"], 
              FieldName5 = (string)r["GroupBy"] 
             }).ToList(); 

При использовании устройства чтения с SQL строки запроса в качестве входных данных, или OLEDB Встраиваемый Query вы можете написать так, чтобы читать и добавлять к объекту.

while (objReader.Read()) 
      { 

       //Upon reading Clean Data for fresh search 
       cboClientGroup.Items.Clear(); 
       cboOccupation.Items.Clear(); 
       cboCompany.Items.Clear(); 
       cboClientID.Items.Clear(); 

       //Apply Fresh Search 
       cboClientGroup.Items.Add(Convert.ToString(
        objReader["Client_Groups"])); 

       cboOccupation.Items.Add(Convert.ToString(
        objReader["Occupation"])); 

       cboCompany.Items.Add(Convert.ToString(
        objReader["Company"])); 

       cboClientID.Items.Add(Convert.ToString(
        objReader["ClientID"])); 
} 
0

Вам необходимо позвонить по методу .Read() на ваш SqlDataReader - по крайней мере один раз, чтобы фактически вернуть данные.

Кроме того, так же, как и SqlConnectionSqlCommand, то SqlDataReader также реализует интерфейс IDisposable и, следовательно, должны быть действительно завернутые в using блоке.

Так что добавьте это в ваш код:

sqlConnectionCmdString.Open(); 

using (reader = sqlCommand.ExecuteReader()) 
{ 
    // iterate over the rows returned by the reader 
    while (reader.Read()) 
    { 
     // Data is accessible through the DataReader object here. 
     IntializedPostNet[i] = reader[i].ToString(); //trying to add data from reader into an array errors here 
    } 

    reader.Close(); 
} 
sqlConnectionCmdString.Close(); 
+0

Итак, я проверил ваш код. Что происходит, так это то, что элемент индекса массива 0 заменяется вторым элементом в массиве, поэтому вместо значений, добавляемых в массив 0 и 1 он просто входит в первый индекс 0, и одно и то же значение отображается дважды и оставляет одно из значений. Почему это так? Значение Index [0] просто удерживается здесь, а теперь он используется для цикла, и он должен добавить его в Index [myfirstvalue], Index [mysecondvalue] моего массива intializedPostNet – shawn

+0

У меня вопрос, в моей базе данных поле сетевого канала имеет несколько из тех же значений, например, в моем сетевом канале, у меня есть две строки значения 2, и я хочу, чтобы все клиенты, которые находятся на втором канале, читатель должен иметь возможность получить все клиенты, которые находятся на канале 2 в сетевом канале поле. поэтому я хочу, чтобы clientA и ClientB получили все значения в поле клиента, где поле сетевого канала равно 2. Таким образом, я могу видеть всех клиентов, которые находятся на канале два – shawn

Смежные вопросы