2013-08-16 3 views
5

У меня возникла проблема, когда я могу только получить данные из базы данных в одном текстовом поле. Что я хочу, я хочу, чтобы извлечь данные из каждого текстовых полей из базы данных, но когда я попробовал, получаю ошибку:Не удалось преобразовать из строки в int32

Вот код:

string connectionString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\Archives\Projects\Program\Sell System\Sell System\App_Data\db1.accdb;Persist Security Info=False;"); 

private List<List<TextBox>> textBoxCodeContainer = new List<List<TextBox>>(); 
private List<List<TextBox>> textBoxQuantityContainer = new List<List<TextBox>>(); 
private List<List<TextBox>> textBoxDescContainer = new List<List<TextBox>>(); 
private List<List<TextBox>> textBoxSubTotalContainer = new List<List<TextBox>>(); 
private List<List<TextBox>> textBoxTotalContainer = new List<List<TextBox>>(); 

private void Form1_Load(object sender, EventArgs e) 
{ 
    UpdateTextPosition(); 

    OleDbDataReader dReader; 
    OleDbConnection conn = new OleDbConnection(connectionString); 
    conn.Open(); 
    OleDbCommand cmd = new OleDbCommand("SELECT [Code] FROM [Data]", conn); 

    dReader = cmd.ExecuteReader(); 

    AutoCompleteStringCollection codesCollection = new AutoCompleteStringCollection(); 

    while (dReader.Read()) 
    { 
     string numString = dReader[0].ToString().PadLeft(4, '0'); 
     codesCollection.Add(numString); 
    } 

    dReader.Close(); 
    conn.Close(); 
} 

private void UpdateDatas() 
{  
    OleDbDataReader dReader; 
    OleDbConnection conn = new OleDbConnection(connectionString); 
    conn.Open(); 
    OleDbCommand cmd = new OleDbCommand("SELECT DISTINCT [Description], [Price] FROM [Data] WHERE [Code][email protected]", conn); 

    cmd.Parameters.Add("Code", System.Data.OleDb.OleDbType.Integer); 
    cmd.Parameters["Code"].Value = this.textBoxCodeContainer[0][0].Text; 

    dReader = cmd.ExecuteReader(); 

    while (dReader.Read()) 
    { 
     this.textBoxDescContainer[0][0].Text = dReader["Description"].ToString(); 
     this.textBoxSubTotalContainer[0][0].Text = dReader["Price"].ToString(); 
    } 

    dReader.Close(); 
    conn.Close(); 
} 

Я уже пытался добавить:

cmd.Parameters.Add("Code", System.Data.OleDb.OleDbType.Integer); 
cmd.Parameters["Code"].Value = this.textBoxCodeContainer[0][1].Text; 

и

while (dReader.Read()) 
{ 
    this.textBoxDescContainer[0][1].Text = dReader["Description"].ToString(); 
    this.textBoxSubTotalContainer[0][1].Text = dReader["Price"].ToString(); 
} 

, но я получил сообщение об ошибке, которая говорит: «Не удалось преобразовать значение параметра из Strin г в int32"

+0

Плохой код. –

+0

где у вас есть ошибка? – Default

+0

Из предложений, которые не удалось, похоже, что у вас проблема с данными. Покажите нам образцы данных? Это может быть код или цена, содержащие нецелые числа. – cjb110

ответ

2

Попробуйте

вы должны разбора снабжать струной, тетивой и т.п. к Int32 DataType

cmd.Parameters.Add("Code", System.Data.OleDb.OleDbType.Integer); 
cmd.Parameters["Code"].Value =int.Parse(this.textBoxCodeContainer[0][1].Text); 

Это должно работать, если пользователь вводит действительное число

Для например,

int Val=int.Parse("45");//Works for me 

Примечание: Это не работает для десятичных значений

В качестве альтернативы Если значение Price содержит -десятичное то, что вы можете сделать, это

cmd.Parameters["Code"].Value = Convert.ToInt32(Convert.ToDouble(this.textBoxCodeContainer[0][1].Text)); 

Это должно работать

+0

Я уже пробовал, но ошибка говорит: строка ввода не была в правильном формате. что происходит? - « – Reinhardt

+0

@Fuhans Взгляните на мой обновленный ответ, ваш ввод содержит десятичные значения, например, 45.21 или 79.45 ?? что-то вроде этого – Rohit

+0

для кода, номер не в десятичной стоимости, но по цене, он содержит десятичные значения в базе данных, которые являются «10.000,00» – Reinhardt

1

изменить line

cmd.Parameters["Code"].Value = this.textBoxCodeContainer[0][0].Text; 

в

cmd.Parameters["Code"].Value = Convert.ToInt32(this.textBoxCodeContainer[0][0].Text); 
+0

Я уже пробовал, но ошибка говорит: входная строка не была в правильном формате. Что случилось? - « – Reinhardt

+0

Я бы предложил http://stackoverflow.com/a/18267369/503110 ответ. Пусть весь текст в текстовом поле textBoxCodeContainer не будет преобразован в int, и в этом случае ваш код взорвется. Вместо этого используйте 'int.TryParse'. – PawanS

0
this.textBoxSubTotalContainer[0][0].Text=Convert.ToInt32(dReader["Price"].ToString()); 

Данное заявление должно помочь ...

С уважением

Анураг

+0

Я уже пробовал, но ошибка говорит: не может имплицировать преобразование типа int в строку – Reinhardt

+0

В какой строке вы получаете ошибку при ?? – Anurag

1

эта линия

cmd.Parameters["Code"].Value = this.textBoxCodeContainer[0][1].Text; 

должен быть изменен на

int codeValue; 
if(int.TryParse(this.textBoxCodeContainer[0][1].Text,out codeValue)) 
    cmd.Parameters["Code"].Value = codeValue; 
else 
    { 
    //do some error handling of invalid input 
    } 

как вы пытаетесь передать строку с параметром типа ineteger.

0

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

  cmd.Parameters.Add("Code", System.Data.OleDb.OleDbType.Integer); 
      cmd.Parameters["Code"].Value = this.textBoxCodeContainer[0][0].Text; 

Вы объявили «Code» как Integer но вы присваиваете значение Text. Преобразуйте это в Int32.

Int32 codeValue = 0; 
Int32.TryParse(this.textBoxCodeContainer[0][0].Text, out codeValue); 
cmd.Parameters.Add("Code", System.Data.OleDb.OleDbType.Integer); 
cmd.Parameters["Code"].Value = codeValue; 
+0

Я уже пробовал этот путь, но ошибка говорит: строка ввода не была в правильном формате. что происходит? - « – Reinhardt

+0

Я отредактировал код. – SollyM

+0

Спасибо, он работает сейчас – Reinhardt

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