2013-08-16 44 views
5

tôi gặp sự cố trong đó tôi chỉ có thể truy xuất dữ liệu từ cơ sở dữ liệu trên một hộp văn bản. Những gì tôi muốn, tôi muốn lấy dữ liệu của tất cả các textbox từ cơ sở dữ liệu, nhưng khi tôi đã cố gắng, nhận được lỗi:Không thể chuyển đổi từ chuỗi thành int32

Đây là mã:

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(); 
} 

Tôi đã thử add:

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(); 
} 

nhưng tôi đã nhận một lỗi mà nói: "Không thể chuyển đổi giá trị tham số từ một strin g để một int32"

+0

Định dạng mã không đúng. –

+0

bạn gặp lỗi ở đâu? – Default

+0

Từ các đề xuất không thành công, có vẻ như bạn có vấn đề về dữ liệu. Hiển thị cho chúng tôi dữ liệu mẫu? Nó có thể là Mã hoặc Giá chứa số nguyên không. – cjb110

Trả lời

2

Hãy thử điều này

bạn phải phân tích chuỗi để Int32 DataType

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

này nên có tác dụng nếu người dùng nhập vào một số nguyên hợp lệ

Đối với ví dụ

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

Lưu ý: này không làm việc cho các giá trị thập phân

Ngoài Nếu giá trị Price của bạn có chứa Decimal những gì bạn có thể làm là

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

này nên làm việc

+0

tôi đã thử, nhưng lỗi nói: chuỗi đầu vào không đúng định dạng. chuyện gì xảy ra - " – Reinhardt

+0

@Fuhans Hãy xem câu trả lời cập nhật của tôi liệu đầu vào của bạn có chứa giá trị thập phân không? Giống như 45.21 hoặc 79.45 ?? cái gì đó như vậy? – Rohit

+0

cho mã, số không có giá trị thập phân, nhưng với giá, nó chứa các giá trị thập phân trong cơ sở dữ liệu, đó là "10.000,00" – Reinhardt

1

Thay đổi dòng

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

để

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

tôi đã thử, nhưng lỗi nói: chuỗi đầu vào không ở định dạng chính xác. Điều gì xảy ra? - " – Reinhardt

+0

Tôi sẽ đề xuất câu trả lời http://stackoverflow.com/a/18267369/503110. Có thể tất cả văn bản trong hộp văn bản 'textBoxCodeContainer' sẽ không chuyển thành int và trong trường hợp đó mã của bạn sẽ bị thổi. Sử dụng 'int.TryParse' để thay thế. – PawanS

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

Những tuyên bố trên sẽ giúp bạn ...

Trân

Anurag

+0

tôi đã thử, nhưng lỗi nói: không thể chuyển đổi kiểu int thành chuỗi – Reinhardt

+0

Bạn nhận được lỗi ở dòng nào? – Anurag

1

dòng này

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

cần phải được thay đổi để

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 
    } 

như bạn đang cố gắng để vượt qua một chuỗi tham số có kiểu ineteger.

0

Theo mã của bạn, mà bạn không thực sự đề cập đến nơi lỗi được nêu ra, điều này dường như là nguồn gốc của vấn đề của bạn.

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

Bạn đã tuyên bố "Code" như một Integer nhưng bạn đang gán một giá trị Text. Chuyển đổi số này thành 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

tôi đã thử cách đó, nhưng lỗi nói: chuỗi đầu vào không đúng định dạng. chuyện gì xảy ra - " – Reinhardt

+0

Tôi đã chỉnh sửa mã. – SollyM

+0

Cảm ơn, nó hoạt động ngay bây giờ – Reinhardt