2011-05-27 29 views
0

我是新來的.net,當我運行該程序時,它報告錯誤「無法將類型爲System.Int32的對象強制轉換爲類型系統。字符串」System.Int32 cound不能轉換爲System.String的類型

進口System.Data 進口System.Data.SqlClient的 進口System.Data.Sql分部類_Default 繼承System.Web.UI.Page

Protected Sub btn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn.Click 
    Dim constr As String 
    constr = ConfigurationManager.ConnectionStrings("libConstr").ConnectionString   Dim conn As SqlConnection 
    conn = New SqlConnection(constr) 
    conn.Open() 
    Dim com As SqlCommand 
    com = New SqlCommand() 
    com.Connection = conn 
    com.CommandText = "select * from library" 
    Dim dr As SqlDataReader 
    dr = com.ExecuteReader() 

    Dim i As Integer 
    i = 0 
    Do While dr.Read() 
     If tbuser.Text = dr.GetString(i) Then //here report the error:無法將類型爲System.Int32的對象強制轉換爲類型System.String(System.Int32 cound not be cast to the type of System.String) 
      If tbid.Text = dr.GetString(i + 1) Then 
       Response.Redirect("library.aspx") 
      End If 
      i = i + 1 
     End If 
    Loop 

End Sub 

有什麼問題,你可以幫助我。 非常感謝。

回答

0

您需要在調用此方法之前檢查空值。

MSDN

不會進行任何轉換;因此,檢索的數據必須是 已經是一個字符串。

調用IsDBNull在調用此方法之前檢查空值 值。

2

看起來,數據讀取器的位置i的值是一個整數,但您試圖檢索它,就好像它是一個字符串。嘗試:dr.GetInt32(i)

不確定什麼是一些胡言亂語。 :)

如果你想將其分配給一個字符串,那麼這樣做:Convert.ToString(dr.GetInt32(i))

+0

但我認爲tbuser.Text是字符串類型。 – hon 2011-05-27 15:54:19

+0

亂碼是中文電腦上的錯誤信息。 – CodesInChaos 2011-05-27 15:54:51

+0

@hon然後你需要先讀取它作爲字符串,並調用'ToString()'的結果。 – CodesInChaos 2011-05-27 15:55:23

0

好像你的數據庫存儲基礎字段爲整數,而不是字符串。因此,您需要調用dr.GetInt32(i),然後將生成的整數轉換爲字符串。

0

您正在使用專門用於從結果集中讀取字符串值的方法。在這種情況下,您正在讀取的值是一個整數,因此該方法拋出異常。如果你想正確讀取值,但它存儲爲一個字符串,我會嘗試:

If tbuser.Text = dr.GetValue(i).ToString() Then 
    If tbid.Text = dr.GetValue(i + 1).ToString() Then 
     Response.Redirect("library.aspx") 
    End If 
End If 
0

有趣的答案,肯定的,並沒有一個是錯誤的(與CodeInChaos的第二次答覆昆的例外,雖然我懷疑這只是一個錯誤的陳述)。但是,你能從這些答案中學到什麼?

GetString(foo)方法需要一個int32類型作爲它的參數(對我來說是foo,我是你),它表示所尋找列的從零開始的序數位置的序數位置。同樣,其餘的Get*type*(foo)方法特定於預期的數據類型,但GetValue(foo)除外。由於YetAnotherUser和Justin Niessner明確指出「沒有轉換被執行」,並且「...方法...用於讀取字符串值...正在拋出異常...」。這是數據訪問層,性能很重要。您應該知道所尋求列的數據類型。如果你不這樣做,那麼使用Justin建議的方法返回一個對象GetValue(foo)

您的i參數是根據需要定義的,而不是問題。

接收對象的類型。財產,tbuser.Text,也不是問題,但它會是如果您將GetString(foo)方法更改爲GetInt32(foo)GetValue(foo),此時您需要*value*.ToString()(或Convert.ToString(*value*))作爲列[i]的值。

瞭解每個列的數據存儲的數據類型,或者使用性能較低的'GetValue(foo)'方法並將結果轉換爲接收類型。

相關問題