C#连接到SQL数据库错误

时间:2014-11-29 16:16:01

标签: c# asp.net sql-server 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();
    }

}

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

  

DBHandlerSystem.Data.SqlClient.SqlException(0x80131904)中的异常:   字符串或二进制数据将被截断。声明一直如此   终止。在   System.Data.SqlClient.SqlConnection.OnError(SqlException异常,   布尔值breakConnection,Action 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction)at   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject   stateObj,Boolean callerHasConnectionLock,Boolean asyncClose)at   System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,   SqlCommand cmdHandler,SqlDataReader dataStream,   BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject   stateObj,布尔& dataReady)at   System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串   methodName,Boolean async,Int32 timeout,Boolean asyncWrite)at   System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1   completion,String methodName,Boolean sendToPipe,Int32 timeout,   布尔asyncWrite)at   System.Data.SqlClient.SqlCommand.ExecuteNonQuery()at   OnlineExamCW.Register.registerBtn_Click(Object sender,EventArgs e)in   f:\ COMP1551 - 应用程序和Web   开发\ OnlineExamCW \ OnlineExamCW \ Register.aspx.cs:第31行   ClientConnectionId:e08ebbe3-d4be-4a76-a64d-14aadb6e9d4c

请告诉我这个错误的含义。非常感谢。

2 个答案:

答案 0 :(得分:7)

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

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&#39这样的姓氏,请尝试;赖利)

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

答案 1 :(得分:1)

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