类型' System.Data.SqlServerCe.SqlCeException'的例外情况发生在System.Data.SqlServerCe.dll中但未在用户代码中处理

时间:2014-03-21 06:02:08

标签: c# sql-server-ce

当我尝试执行它时,此代码会导致错误。

我的要求获得最新插入的增量ID

_connection.Open();
cmd.Connection = _connection;

cmd.CommandText = "Insert into Finalresult(Section_name, userId, examid) Select Section_name, User_id, Exam_id from result" +
                  "WHERE (User_id = '" + userid + "' Exam_id='" + examis + "' And Section_name='" + section + "')SELECT SCOPE_IDENTITY()";

Int32 newId = (Int32)cmd.ExecuteScalar();

发生错误
Int32 newId = (Int32)cmd.ExecuteScalar(); 

错误是

  

System.Data.SqlServerCe.dll中发生了'System.Data.SqlServerCe.SqlCeException'类型的异常,但未在用户代码中处理

3 个答案:

答案 0 :(得分:3)

您需要在此处进行一些更改,例如添加错误处理。要了解异常背后的原因,您需要检查异常的Errors属性:

try
{
    //Your code here
}
catch (SqlCeException e)
{
    foreach (SqlCeError error in e.Errors)
    {
        //Error handling, etc.
        MessageBox.Show(error.Message);
    }
}

这样做,它会准确地告诉你错误是什么。

我认为您的User_idExam_id'参数'在SQL语句中被视为字符串,因为您用单引号将其包围起来。猜测,这将是你的问题以及WHERE子句中缺少逻辑运算符。

但是不要这样做参数化!当你以这种方式连接查询时,你会对SQL注入攻击开放。有关如何执行此操作的MSDN上有很多文章和信息,或者从Jeff Atwood看一下这些文章和信息 - http://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/

<强>更新

好的,根据 marc_s 的评论进一步细分,你不能在SQL CE中使用SCOPE_IDENTITY()。所以你正在考虑这样做:

参数化插页:

    var sqlString = "Insert into Finalresult(Section_name, userId, examid) Select Section_name, User_id, Exam_id from result " +
                      "WHERE (User_id = @userId AND Exam_id = @examId AND Section_name = @sectionName"

    cmd.CommandText = sqlString;
    cmd.Parameters.Add("@userId", userid); 
    cmd.Parameters.Add("@examId", examId); 
    cmd.Parameters.Add("@sectionName", section); 

    cmd.ExecuteNonQuery();

然后在相同的连接上(当然是不同的命令),获取插入的ID:

cmd.Connection = _connection;
cmd.CommandText = "SELECT @@identity";
Int32 newId = (Int32)cmd.ExecuteScalar();

我没有对此进行测试或编译,因此请将其作为一个想法/指导。

答案 1 :(得分:0)

如果是userid,则Examids为int,则不要使用单引号。

cmd.CommandText = "Insert into Finalresult(Section_name, userId, examid) Select Section_name, User_id, Exam_id from result" +
              " WHERE (User_id = " + userid + " Exam_id=" + examis + " And Section_name='" + section + "')SELECT SCOPE_IDENTITY()";

答案 2 :(得分:0)

您的查询中存在错误。试试这个:

cmd.CommandText = "Insert into Finalresult(Section_name, userId, examid) Select Section_name, User_id, Exam_id from result" +
                  " WHERE (User_id = '" + userid + "' AND Exam_id='" + examis + "' And Section_name='" + section + "')SELECT SCOPE_IDENTITY()";