2014-02-06 1 views
0

Вот код, который я использовал, и он будет всплывать в Exception при 3-й команде. Назначение CommandText, но это то же самое, что я использовал во второй команде. Назначение CommandText,Входная строка не была в правильном формате в SqlCommand

SqlCommand command = conn.CreateCommand(); 
    conn.Open(); 
    //1st 
    command.CommandText = query; 
    SqlDataReader reader = command.ExecuteReader(); 
    ArrayList alMainGrid = new ArrayList(); 

    while (reader.Read()) 
    { 

    SupportTable table = new SupportTable(); 
    table.LaySheetNo = reader.GetValue(0).ToString(); 
    table.PlnLayStartTime = reader.GetDateTime(1).ToString(); 
    table.PlnLayEndTime = reader.GetValue(2).ToString(); 
    table.LayTableId = reader.GetValue(3).ToString();// reader.GetValue(3).ToString(); 
    table.LayTeamId = reader.GetValue(4).ToString(); 
    alMainGrid.Add(table); 
    } 
    reader.Close(); 

    foreach (SupportTable table in alMainGrid) 
    { 
     //2nd 
     command.CommandText = String.Format("SELECT CTDesc FROM CutTable WHERE CTId ={0}", int.Parse(table.LayTableId)); 
     string tableDesc = (string)command.ExecuteScalar(); 
     table.LayTeamId = tableDesc; 

    //3rd-In this command.CommandText 
     command.CommandText = String.Format("SELECT TeamDesc FROM Team WHERE TeamId ={0}", int.Parse(table.LayTeamId)); 
     string teamDesc = (string)command.ExecuteScalar(); 
     table.LayTeamId = teamDesc; 
    } 
    dgvMain.DataSource = alMainGrid; 
+1

Что такое исключение? –

+1

Похож, что 'table.LayTeamId' - пустая строка или содержит несимвольные символы. – ekad

+2

Кстати, вы не должны указывать строки, чтобы сформировать ваш запрос. Это хороший способ сделать себя уязвимым для атак SQL Injection –

ответ

1

при назначении table.LayTeamId в строке пару строк выше, где вы видите исключение:

table.LayTeamId = tableDesc; 

Я ожидаю, что tableDesc будет присвоить значение table.LayTeamId, которые не могут быть разобраны на Int а затем взрывается при попытке разобрать его здесь:

command.CommandText = String.Format("SELECT TeamDesc FROM Team WHERE TeamId ={0}", int.Parse(table.LayTeamId)); 

ПРИМЕЧАНИЕ:

Это плохой способ формирования запросов от конкатенации строк. Это сделает вас уязвимыми для атак SQL Injection, если вы не будете осторожны. Используйте параметризованные запросы для дезинфекции ваших запросов перед их выполнением в своей базе данных.

0

Попробуйте

command.CommandText = String.Format("SELECT CTDesc FROM CutTable WHERE CTId ={0}", (table.LayTableId == "") ? -1 : Convert.ToInt32(table.LayTableId); 


command.CommandText = String.Format("SELECT TeamDesc FROM Team WHERE TeamId ={0}", (table.LayTeamId == "") ? -1 : Convert.ToInt32(table.LayTeamId);