2016-11-03 2 views
0

Я пытаюсь прочитать колонку из считывания данных в этикетку (с # WinForm) Мой код выглядит следующим образом:C# WinForms Аргумент 1: не удается преобразовать из «строка» до «межд»

SqlCommand command1 = new SqlCommand("select plant_name,plant_id from plant order by plant_id ", connection); 

     try 
     { 
      connection.Open(); 
      SqlDataReader dr = command1.ExecuteReader(); 

      while (dr.Read()) 
      { 
       string plantlable = dr.GetInt32("plant_id").ToString(); 
       labelplantid.Text = plantlable.ToString(); 

       comboBoxplant.Items.Add(dr["plant_name"]); 


      } 

      dr.Close(); 
      dr.Dispose(); 
      connection.Close(); 
     } 

     catch (Exception ex) 
     { 

      MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
      Application.Exit(); 
     } 

я получаю ошибку «Аргумент 1: не удается преобразовать из„строка“в„межд“» на следующей строке

string plantlable = dr.GetInt32("plant_id").ToString(); 

с plant_id подчеркнуты красным цветом.

Что я делаю неправильно? Я не могу понять это. plant_id - это тип столбца Int. Использование Sql Server 2008 для базы данных.

Любые подсказки были бы благодарны.

+0

Вы пытались получить целочисленное значение из строки, отличной от числа, что не имеет смысла. 'dr [" plant_id "]' следует использовать вместо этого. См. Https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getint32(v=vs.110).aspx для информации о методе GetInt32. –

+0

спасибо .. это сработал .... labelplantid.Text = dr ["plant_id"]. ToString(); – Harry

ответ

2

SqlDataReader.GetInt32 Метод принимает целое число в качестве параметра. Это целое число обозначает индекс поля, которое вы пытаетесь ссылаться. В вашем случае «plant_name» будет индексом 0, а «plant_id» будет индексом 1, так как это тот порядок, который вы указали в SQL-запросе.

Вы получаете сообщение об ошибке, поскольку вместо передачи индекса вы обрабатываете GetInt32 в качестве словаря getter и пытаетесь получить доступ к «plant_id» напрямую. Вместо этого попробуйте следующее:

string plantlable = dr.GetInt32(1).ToString(); 

В качестве альтернативы, вы можете получить значение непосредственно в качестве объекта из SqlDataReader, используя индексатор (массив) обозначения:

string plantlable = dr["plant_id"].ToString(); 
+0

thankyou .. это сработало ... string plantlable = dr.GetInt32 (1) .ToString(); labelplantid.Text = plantlable.ToString(); – Harry

0

С помощью этой строки dr.GetInt32("plant_id") вы пытаетесь прочитать целочисленное значение из DataReader. и в сообщении об ошибке говорится, что вы пытаетесь преобразовать строку в целое, что означает, что столбец plant_id будет либо текстом, либо Varchar, либо чем-то подобным (не целочисленным). Не могли бы вы перепроверить тип ?.

Если да, то вы можете попробовать SqlDataReader.GetString метод для чтения этого значения, в этом случае вам не нужно, чтобы добавить .ToString(), й ecode будет:

labelplantid.Text = dr.GetString("plant_id"); 
+0

Я посмотрел на таблицу и вот инструкция create .. довольно уверен, что plant_id is int CREATE TABLE [dbo]. [Plant] ( \t [ID] [int] NOT NULL, \t [plant_id] [int] NOT NULL, \t [имя_завода] [varchar] (25) NOT NULL, CONSTRAINT [PK_plant] ПЕРВИЧНАЯ КЛАВИАТУРА – Harry

+0

BTW ..используя код, который вы указали, все равно приводит к той же ошибке:/ – Harry

0

Для тех, кто ищет ответ .. здесь это:

labelplantid.Text= dr["plant_id"].ToString(); 

или это

string plantlable = dr.GetInt32(1).ToString(); 
labelplantid.Text = plantlable.ToString(); 

либо один работает. Спасибо за подсказки: