2009-03-27 45 views
7

Tôi có một máy tính xách tay mới tại nơi làm việc và mã hoạt động trước đó trong tuần không hoạt động hôm nay.C# chuỗi phân tích cú pháp "0" thành số nguyên

Mã mà làm việc trước khi là, đơn giản hóa:

while (dr.Read()) 
{ 
    int i = int.Parse(dr.GetString(1)) 
} 

Bây giờ nó không thành công khi giá trị cơ sở dữ liệu là 0. Đôi khi, nhưng không đáng tin cậy, điều này sẽ làm việc thay vì:

while (dr.Read()) 
{ 
    int i = Convert.ToInt32(dr["FieldName"])) 
} 

Am I thiếu một cái gì đó ngu ngốc?

Rất kỳ quặc, ReSharper cũng có rất nhiều lỗi lạ với cùng thông báo lỗi mà tôi nhận được với mã ở trên: "chuỗi đầu vào không đúng định dạng". (Bắt đầu trước khi tôi thậm chí tải một dự án.)

Bất kỳ ý tưởng nào? Bất cứ ai có bất kỳ vấn đề SP? Tôi đã cố gắng để đảm bảo tất cả các SP của tôi đã được cập nhật khi tôi có máy.

EDIT: Tôi hiểu cách sử dụng Try.Parse và xử lý lỗi. Mã ở đây được đơn giản hóa. Tôi đang đọc các trường hợp thử nghiệm từ một bảng cơ sở dữ liệu. Cột này chỉ có giá trị 0, 1 và 2. Tôi đã xác nhận điều đó. Tôi đã phá vỡ này xuống đặt trường cơ sở dữ liệu vào một biến chuỗi s và sau đó cố gắng int.Parse (s). Mã hoạt động vào đầu tuần này và cơ sở dữ liệu không thay đổi. Điều duy nhất đã thay đổi là môi trường của tôi.

Để đơn giản hóa hoàn toàn vấn đề, dòng mã này ném một ngoại lệ ("chuỗi đầu vào là không đúng định dạng"):

int.Parse("0"); 

EDIT: Cảm ơn tất cả mọi người vì đã giúp tôi giải quyết vấn đề này! Giải pháp đã buộc đặt lại cài đặt ngôn ngữ của tôi.

+0

loại dữ liệu nào là cột bảng? –

+0

Trường có cho phép giá trị null không? –

+0

Nếu bạn tạo một ứng dụng mới với dòng duy nhất của mã thực thi tùy chỉnh là int.Parse ("0"); và nó đang ném một lỗi, sau đó tôi nghĩ rằng bạn có thể có một vấn đề lớn hơn. –

Trả lời

21

Một thể explanation:

Về cơ bản, vấn đề là giá trị sPositiveSign dưới HKEY_CURRENT_USER \ Control Panel \ International được đặt thành 0, có nghĩa là dấu hiệu tích cực là '0'. Do đó, trong khi phân tích cú pháp "dấu dương 0" đang bị cắt và sau đó phần còn lại của chuỗi ("") được phân tích thành số , không hoạt động. Điều này cũng giải thích tại sao int.Parse ("00") không phải là vấn đề. Mặc dù bạn không thể đặt dấu dương cho '0' qua Bảng điều khiển, vẫn có thể để thực hiện việc này thông qua sổ đăng ký, gây ra sự cố . Không có ý tưởng như thế nào máy tính của người dùng trong bài kết thúc với thiết lập sai này ...

Hơn thế nữa

, những gì là sản phẩm của này trên máy tính của bạn:

Console.WriteLine(System.Globalization.NumberFormatInfo.GetInstance(null).PositiveSign); 

tôi m sẵn sàng đặt cược bạn in ra 0 ... khi tôi in ra một dấu hiệu +.

Tôi khuyên bạn nên kiểm tra cài đặt Control Panel > Regional and Language Options ... nếu chúng xuất hiện bình thường, hãy thử thay đổi chúng thành thứ gì đó khác với ngôn ngữ bạn đang sử dụng (tôi giả định tiếng Anh).

+0

Thay vào đó, thay vào đó, giá trị này có phải là 0 không? –

+0

Cảm ơn, tôi sẽ kiểm tra điều này một chút sau khi tôi để những chú chó ra ngoài, LOL. – Leslie

+0

@chris - không (dùng thử với "010", bạn vẫn nhận được 10), nhưng ngay cả như vậy một bát phân 0 vẫn là 0 :) –

2

Bạn có chắc là "0" chứ không phải "rỗng" không? Bạn nhận được ngoại lệ gì?

EDIT:

Chỉ cần ra khỏi tò mò, nếu nó thực sự là đứt gãy trên int.Parse ("0"), có thể bạn cố gắng int.Parse ("0", CultureInfo.InvariantCulture) ;?

Nếu không, hãy đăng truy vấn của bạn. Bất kỳ tham gia?

+0

Tôi là số dương và không bằng 0. Cột chỉ có 0, 1 và 2. Chỉ 0 không thành công. System.FormatException: Chuỗi đầu vào không đúng định dạng. – Leslie

+0

0 có được lưu dưới dạng giá trị số không? Kiểu dữ liệu nào là cột trong bảng. –

+0

Trường cơ sở dữ liệu là int. – Leslie

2

Edit:
@ phản ứng của Mike khiến tôi nghĩ rằng đó là hành vi vô cùng kỳ quặc và tìm kiếm google đơn giản mang lại kết quả này: int.Parse weird behavior

Chuỗi trống cũng có thể gây ra vấn đề này.

Bạn có thể kiểm tra dbnull trước khi phân tích cú pháp, cũng tốt để xác thực dữ liệu được phân tích cú pháp.

Bạn có thể sử dụng một giá trị mặc định và TryParse ..

int i = -1; 
if(!int.TryParse(dr["MyColumn"] as string, out i)) 
    //Uh Oh! 

Edit:
Tôi đăng này như một bình luận trong @ Chris câu trả lời, nhưng nếu datatype sql là int thì tại sao không chỉ cần sử dụng Phương pháp GetInt32 trên DataReater thay vì truy xuất nó dưới dạng chuỗi và phân tích cú pháp thủ công?

+0

Tôi nghĩ có vấn đề với điều đó, nhưng tôi không nhớ chúng là gì. Tôi đã vật lộn với điều này cả ngày. – Leslie

+0

Cảm ơn bạn đã thêm chỉnh sửa đó! Đó là chính xác những gì tôi đang tìm kiếm. Tôi không có ý tưởng bao lâu nó đã đưa họ để tìm thấy một trong đó :) Tôi đánh giá cao bạn tìm thấy các liên kết phù hợp để xem xét. – Mike

+0

@Mike, Không vấn đề gì khi bạn nói rằng bạn có cùng một vấn đề mà tôi phải xem xét, tôi thực sự vui vì nó rất hữu ích. –

3

Tôi nghĩ rằng thường không được coi là một ý tưởng hay để gọi Chuyển đổi.ToInt32 cho giá trị đọc ra khỏi cơ sở dữ liệu, những gì về giá trị là null, những gì về giá trị không thể được phân tích cú pháp. Bạn có bất kỳ mã xử lý ngoại lệ nào ở đây không.

  1. Đảm bảo giá trị không rỗng.
  2. Kiểm tra giá trị có thể được phân tích cú pháp trước khi gọi Int32.Parse. Xem xét Int32.TryParse.
  3. xem xét sử dụng một loại có thể vô hiệu hóa như int? trong trường hợp này.

HTH.

0

bạn có đang kiểm tra không?

if(!dr.IsNull("FieldName")){ 
    int i = Convert.ToInt32(dr["FieldName"])) 
} 
1

bạn nên kiểm tra dr [ "FieldName"]! = DBNull.Value và bạn nên sử dụng TryParse nếu nó vượt qua các bài kiểm tra DBNull ...

if (dr["FieldName"] != DBNull.Value) 
{ 
    int val = 0; 
    if (int.TryParse(dr["FieldName"], out val)) 
    { 
     i = val; 
    } 
    else 
    { 
     i = 0; // or some default value 
    } 
} 
1

tôi đã thấy cây vấn đề này với .NET Double class, phân tích cú pháp từ chuỗi "0".

Đây là phần thực sự khó hiểu: bạn có thể vượt qua vấn đề bằng cách sử dụng tài khoản người dùng khác để chạy chương trình và đôi khi bạn hủy và tạo lại tài khoản người dùng hiện tại trên máy, nó sẽ chạy tốt .

Tôi chưa theo dõi điều này, nhưng bạn có thể vượt qua nó theo cách này ít nhất.

+0

Cảm ơn bạn vì điều gì đó ngoài việc xử lý lỗi để thử !!! Tôi biết cách kiểm tra null. :) – Leslie

1

Đây là cách thoát khỏi trường bên trái, nhưng hãy kiểm tra cài đặt bản địa hóa của bạn. Tôi đã có một số "chuỗi đầu vào không đúng định dạng" khi tôi chuyển một trang web sang máy chủ của Canada. Vấn đề nằm trong phương thức DateTime.Parse và đã được sửa bằng cách đặt văn bản thành "en-US".

Có, tình huống của bạn khác nhau — nhưng hey, bạn không bao giờ biết.

+0

Vâng, đó là bản địa hóa. Nó nói rằng nó đã được US-EN, nhưng thay đổi nó sang tiếng Pháp và trở lại tiếng Anh giải quyết vấn đề. Cảm ơn! – Leslie

Các vấn đề liên quan