2013-04-12 4 views
0

Я имею интересное время, используя Statement ниже, который читает как этотSQLCommand Сбой Когда параметр соединения Не указан

SqlCommand RiskRevalCommand = 
    new SqlCommand("select * from CreditAdmin.dbo.CreditData_Test"); 

Я принял заявление SQL прямо из запроса в SQL Server Management Studio, так что я знаю она работает там, но теперь это вызывает исключение быть выброшено, когда программа пытается выполнить эту строку:

SqlDataReader reader = RiskRevalCommand.ExecuteReader(); 

и ошибка читает:

ExecuteReader: свойство Connection не инициализировано.

SqlConnection xavierConnection = 
    new SqlConnection("user id=FB\\user;" + 
     "password=password;" + 
     "server=dataserver;" + 
     "Trusted_Connection=yes;" + 
     "database=CreditAdmin;" + 
     "connection timeout=15"); 

try 
{ 
    xavierConnection.Open(); 
} 
catch (Exception e) 
{ 
    MessageBox.Show(e.Message); 
} 

try 
{ 
    SqlCommand RiskRevalCommand = new SqlCommand("select * from CreditAdmin.dbo.CreditData_Test"); 

SqlDataReader reader = RiskRevalCommand.ExecuteReader(); 

while (reader.Read()) 
{ 
    try 
    { 
     double.TryParse(reader["Available Balance"].ToString(), out _availability); 
     ... 
    } 
} 
catch (Exception e) 
{ 
    MessageBox.Show(e.Message); 
} 

//close the connection 
try 
{ 
    xavierConnection.Close(); 
} 
catch (Exception e) 
{ 
    MessageBox.Show(e.Message); 
} 

Что я должен изменить в моей SQL заявление так, что он не взорвется, и так, что я могу еще сделать TryParsing для полей?

Также как это происходит, когда this работает?

(Это то, что было в месте select * я использую сейчас)

+1

Что вам действительно нужно сделать, это положить SqlConnection, SqlCommand и SqlDataReader в 'using' блоков. Вам также необходимо удалить блоки try/catch. Возможно, у вас есть один на верхнем уровне, чтобы убедиться, что отображается MessageBox.Show. И в этом вы должны отображать 'ex.ToString()', а не 'ex.Message' –

ответ

3

Не забудьте добавить SqlConnection в конструктор SqlCommand.

http://msdn.microsoft.com/en-us/library/877h0y3a.aspx

Как:

var cmd = new SqlCommand(thisSelectStatementString, myConnection); 

Или, как Кирк отметил:

var cmd = myConnection.CreateCommand(thisSelectStatementString); 
+1

* Или * просто используйте 'myConnection.CreateCommand()' и сделайте это для вас. –

+0

@KirkWoll: хорошая точка! – code4life

0

Я думаю, вы соединение блокируется в рамках Ьгу выше, попробуйте это один

 try 
     { 
      xavierConnection.Open(); 

      SqlCommand RiskRevalCommand = new SqlCommand("select * from CreditAdmin.dbo.CreditData_Test", xavierConnection/*don't forget this*/); 


      SqlDataReader reader = RiskRevalCommand.ExecuteReader(); 

      while (reader.Read()) 
      { 
       //no need to try-catch here 
       double.TryParse(reader["Available Balance"].ToString(), out _availability); 
        ... 
      } 
     } 

     catch (Exception e) 
     { 
       MessageBox.Show(e.Message); 
     } 

     finally 
     { 
       xavierConnection.Close(); 
     } 

, а также вы устанавливаете Trusted_Connection=true но вы уже установили username и password изменить его на ложь,

попробовать этот формат в строке подключения

ConnectionString = "server=Server; user id=FB\\user; password=top$secret;" + 
      "database=dataserver; Trusted_Connection=false; Asynchronous Processing=true"; 
+0

Нет, соединение OP объявлено в самой внешней области. –

+0

Да, я не заметил, потому что код полон try catch: D – Pyromancer

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