簡體   English   中英

C#連接到SQL數據庫錯誤

[英]C# connection to SQL database error

我是編程的新手。 我的程序有問題,我想做的是創建一個注冊頁面,以便用戶可以注冊,並將其保存到SQL數據庫中,但是出現錯誤,我不知道這意味着什么,我將整個粘貼錯誤消息對不起,如果它不是特定的。 如果可以的話,請簡單地向我解釋。


這是我的代碼:

protected void registerBtn_Click(object sender, EventArgs e)
{
    String conString = @"Data Source=sql-server;Initial Catalog=wa310;Integrated Security=True";
    SqlConnection myConnection = new SqlConnection(conString);

    string cmd = "INSERT INTO Student( First_Name, Surname, User_ID, Password) VALUES ( '" + fNameTxt.Text + "' , '" + sNameTxt.Text + "','" + userIdTxt.Text + "' ,'" + passwordTxt.Text + "')";
    SqlCommand myCommand = new SqlCommand(cmd, myConnection);

    try
    {
      myCommand.Connection = myConnection;
        myConnection.Open();
        myCommand.ExecuteNonQuery();
        Label1.Text = "You have successfully registered";
    }
    catch (Exception ex)
    {
        Label1.Text = "Exception in DBHandler" + ex;
    }
    finally
    {
        myConnection.Close();
    }

}

這是我得到的錯誤,再次對冗長的錯誤消息感到抱歉:

DBHandlerSystem.Data.SqlClient.SqlException(0x80131904)中的異常:字符串或二進制數據將被截斷。 該語句已終止。 在System.Data.SqlClient.SqlInternalConnection.OnError(SqlException異常,布爾值BreakConnection,操作1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction)在System.Data.SqlClient.TdsParser .System.Data.SqlClient.TdsParser.TryRun(ThrowExceptionAndWarning(TdsParserStateObject stateObj,Boolean callerHasConnectionLock,Boolean asyncClose)at Run。 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 complete,String methodName,Boolean sendToPipe,Int32 timeout,Boolean asyncWrite)在System.Data.SqlClient.SqlCommand處運行RunExecuteNonQueryTds(String methodName,Boolean async,Int32 timeout,Boolean asyncWrite) OnlineExamCW.Register.registerBtn_Click上的.ExecuteNonQuery() (對象發件人,EventArgs e)位於f:\\ COMP1551-應用程序和Web開發\\ OnlineExamCW \\ OnlineExamCW \\ Register.aspx.cs:第31行ClientConnectionId:e08ebbe3-d4be-4a76-a64d-14aadb6e9d4c

請告訴我這個錯誤是什么意思。 非常感謝。

該錯誤消息告訴您輸入值中的內容太長而無法存儲在指定的列中。 在不知道列大小的情況下,很難提出正確的解決方案,因此,假設您在數據庫字段中具有合理的限制,例如在此假設模式中:

First_Name nvarchar(50)
Surname nvarchar(50)
User_ID int
Password nvarchar(16)

那么您應該將輸入字段的最大長度限制為數據表字段所允許的大小。

<asp:TextBox ID="fNameTxt" MaxLength="50" Text="" runat="server"/>
.....

然后使用這種方法創建您的插入命令

protected void registerBtn_Click(object sender, EventArgs e)
{
    String conString = "....";
    string cmd = @"INSERT INTO Student( First_Name, Surname, User_ID, Password) 
                   VALUES (@first, @surname, @id, @password);"
    using(SqlConnection myConnection = new SqlConnection(conString))
    using(SqlCommand myCommand = new SqlCommand(cmd, myConnection))
    {
        myCommand.Parameters.Add(new SqlParameter() 
        {
           ParameterName = "@first",
           Value= fNameTxt.Text, 
           SqlDbType = SqlDbType.NVarChar,
           Size = 50
        });

        myCommand.Parameters.Add(new SqlParameter
        {
             ParameterName = "@surname",
             Value= sNameTxt.Text, 
             SqlDbType = SqlDbType.NVarChar,
             Size = 50
        });
        myCommand.Parameters.Add(new SqlParameter() 
        {
             ParameterName = "@id",
             Value= Convert.ToInt32(userIdTxt.Text), 
             SqlDbType = SqlDbType.Int
        });
        myCommand.Parameters.Add(new SqlParameter() 
        {
             ParameterName = "@password",
             Value= passwordTxt.Text, 
             SqlDbType = SqlDbType.NVarChar,
             Size = 16
        });

        myCommand.Connection = myConnection;
        myConnection.Open();
        if(myCommand.ExecuteNonQuery() > 0)
            Label1.Text = "You have successfully registered";
    }
}

注意,在這段代碼中,我完全刪除了字符串連接方法。 這是編寫sql語句的非常危險的模式,因為如果有人在輸入值中輸入單引號,則使用Sql Injection技術很容易被黑客入侵,並且代碼可能會失敗(例如,嘗試使用O'Reilly這樣的姓氏)

還有一點需要重新設計。 以明文形式存儲密碼被認為是一種非常糟糕的做法,因為對數據庫表的簡單瀏覽可以顯示所有學生的密碼。 但這是一個更復雜的問題。 如果您有興趣搜索有關密碼哈希

這意味着您要在“學生”表中插入的一個或多個字段中的數據具有比該字段所允許的字符更多的字符。 檢查所有字段的長度-名,姓,用戶名,密碼。 要么增加數據庫中的字段長度,要么在數據輸入頁面上設置限制,以使用戶不能在每個字段中輸入超出允許的字符數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM