C#连接到SQL数据库错误

arm*_*ze3 0 c# sql-server asp.net message

我是编程的新手.我有我的程序有问题,我所要做的是创建一个注册页面,以便用户可以注册,它会保存到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();
    }

}
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误,再次抱歉长错误消息:

DBHandlerSystem.Data.SqlClient.SqlException(0x80131904)中的异常:字符串或二进制数据将被截断.该语句已终止.在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection,动作1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1个wrapCloseInAction)在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔callerHasConnectionLock,布尔asyncClose)在System.Data.SqlClient.TdsParser. System.Data.SqlClient上的System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName,Boolean async,Int32 timeout,Boolean asyncWrite)中的TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&dataReady). SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1完成,字符串方法名,布尔sendToPipe,的Int32超时,布尔asyncWrite)在System.Data.SqlClient.SqlCommand.ExecuteNonQuery()在OnlineExamCW.Register.registerBtn_Click(对象发件人,EventArgs e)在F:\ COMP1551 - 应用程序和Web开发\ OnlineExamCW\OnlineExamCW\Register.aspx.cs:第31行Cli entConnectionId:e08ebbe3-d4be-4a76-a64d-14aadb6e9d4c

请告诉我这个错误意味着什么.非常感谢.

Ste*_*eve 6

错误消息告诉您输入值中的某些内容太长而无法存储在指定列中.在不知道列的大小的情况下很难提出正确的解决方案,因此,假设您在数据库字段中有合理的限制,例如在这个低位的模式中:

First_Name nvarchar(50)
Surname nvarchar(50)
User_ID int
Password nvarchar(16)
Run Code Online (Sandbox Code Playgroud)

那么您应该将输入字段的最大长度限制为数据表字段允许的相同大小.

<asp:TextBox ID="fNameTxt" MaxLength="50" Text="" runat="server"/>
.....
Run Code Online (Sandbox Code Playgroud)

然后使用此方法创建插入命令

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,在此代码中,我完全删除了字符串连接方法.这是一个非常危险的方式来写SQL语句,因为你可以用很容易破解SQL注入技术,如果有人进入的输入值的单引号(尝试例如像O'Reilly的姓氏),你的代码可能会失败

还有一点需要深入重新设计.以明文形式存储密码被认为是一种非常糟糕的做法,因为简单地查看数据库表可能会显示所有学生的密码.但这是一个更复杂的问题.如果您有兴趣搜索密码哈希