【问题标题】:C# connection to SQL database errorC# 连接到 SQL 数据库错误
【发布时间】:2016-04-05 00:34:09
【问题描述】:

我完全是编程新手。我的程序有问题,我想做的是创建一个注册页面,以便用户可以注册,它会保存到 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.SqlConnection.OnError(SqlException 异常, Boolean breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler、SqlDataReader 数据流、 BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) 在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串 方法名,布尔异步,Int32 超时,布尔异步写入)在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 完成,字符串方法名,布尔型 sendToPipe,Int32 超时, 布尔 asyncWrite) 在 System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 在 OnlineExamCW.Register.registerBtn_Click(Object sender, EventArgs e) in f:\COMP1551 - 应用程序和 Web 开发\OnlineExamCW\OnlineExamCW\Register.aspx.cs:第 31 行 ClientConnectionId:e08ebbe3-d4be-4a76-a64d-14aadb6e9d4c

请告诉我这个错误是什么意思。非常感谢。

【问题讨论】:

  • 错误消息告诉您输入值中的某些内容太长而无法存储在指定列中。请显示当前数据库中的 Student 表的架构。

标签: c# asp.net sql-server message


【解决方案1】:

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

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 这样的姓氏)

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

【讨论】:

    【解决方案2】:

    这意味着您在 Student 表中插入的一个或多个字段中的数据包含的字符数超过了字段允许的字符数。检查所有字段的长度 -First_Name、Surname、User_ID、Password。要么增加数据库中的字段长度,要么限制数据输入页面,这样用户就不能在每个字段中输入超过允许的字符。

    【讨论】:

    • 谢谢。在SQL数据库上犯了一个愚蠢的错误,我没有添加字段长度。
    猜你喜欢
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多