C# 会话变量值未存储到MS Sql Server数据库中

C# 会话变量值未存储到MS Sql Server数据库中,c#,asp.net,sql-server,database,razor,C#,Asp.net,Sql Server,Database,Razor,我正在使用两个会话变量,我将会话变量分配给另一个变量,并显示它。从会话变量中正确获取值,但当我尝试将值插入MS Sql Server数据库时,该值没有插入到数据库中…知道吗 下面是我的代码: Session["selected"] = "apple"; Session["current"] = 1; string mycategory = Session["selected"].ToString(); int myId = Convert.ToInt32(Session["current"])

我正在使用两个会话变量,我将会话变量分配给另一个变量,并显示它。从会话变量中正确获取值,但当我尝试将值插入MS Sql Server数据库时,该值没有插入到数据库中…知道吗

下面是我的代码:

Session["selected"] = "apple";
Session["current"] = 1;

string mycategory = Session["selected"].ToString();
int myId = Convert.ToInt32(Session["current"]);

con.Open();
SqlCommand cmd = new SqlCommand("INSERT INTO [Marking] VALUES (@photoid, @photocategoryjudge, @totalmarks)", con);
cmd.Parameters.Add("@photoid", SqlDbType.Int).Value = myId;
cmd.Parameters.Add("@photocategoryjudge", SqlDbType.VarChar).Value = mycategory;
cmd.Parameters.Add("@totalmarks", SqlDbType.Int).Value = totalMarks;
cmd.ExecuteNonQuery();
con.Close();
我没有答案,但我有一些简单的步骤可以帮助您进行调试,这些步骤的基础是良好的编码标准,可以在未来的项目中使用,

首先要做的是实现异常处理,这将通过
try…catch…finally
块来完成。您将为大多数实际的SQL命令尝试代码块,如果抛出错误,它将把您抛出Catch块。为异常分配变量将允许您悬停查看详细信息。捕获可以针对不同的条件进行堆叠,异常是捕获所有类型异常的最后一种类型。这有点像一个
case
语句,其中只有一个catch系列会触发。此块的最后一部分是Finally语句,它将在预期命令完成或异常处理发生后运行

您没有使用的是
ExecuteNonQuery()
方法实际上有一个返回值(int32),它表示Sql语句中受影响的行的值。对于简单的insert语句,这应该是1。如果这是一个update命令,则可能为0或更高,具体取决于行数或任何条件。无论哪种方式,它都将始终等于或大于0。我在这里是如何实现的,如果编码中有错误,它将分配一个负值,并且为每种类型的异常分配一个不同的值

最后一件事是在带有断点的调试模式下运行代码。当您点击断点时,查看哪些变量具有哪些值。这将有助于了解发生了什么错误(如果有)。您可以检查Sql语句并尝试直接在SSMS中运行(如果这是错误源)

祝你好运

Session["selected"] = "apple";
Session["current"] = 1;

string mycategory = Session["selected"].ToString();
int myId = Convert.ToInt32(Session["current"]);

int ra; //                                 ra = Rows Affected

try {
    con.Open();
    SqlCommand cmd = new SqlCommand("INSERT INTO [Marking] VALUES (@photoid, @photocategoryjudge, @totalmarks)", con);
    cmd.Parameters.Add("@photoid", SqlDbType.Int).Value = myId;
    cmd.Parameters.Add("@photocategoryjudge", SqlDbType.VarChar).Value = mycategory;
    cmd.Parameters.Add("@totalmarks", SqlDbType.Int).Value = totalMarks;
    ra = cmd.ExecuteNonQuery();
}
catch (SqlException sx) {
    ra = -2; //                             breakpoint here
    // If you stop here, your SQL has an error. Hover on sx for detail
    // Error handling routine
catch (Exception ex) {
    ra = -1; //                             breakpoint here
    // non-sql error block. Hover on ex for more info
    // Error handling routine
}
finally {

    con.Close();
}

int Results = ra; //                        breakpoint here

是否设置了
totalMarks
?这是
标记表中的必填字段吗?
标记
表中是否有其他列未使用此
插入
语句设置?最好明确说明要插入哪些列:
INSERT-into[Marking](PhotoID,phototegory,TotalMarks)值(…
yup-TotalMarks也已设置,我尝试插入[Marking](PhotoID,phototegory,TotalMarks)值(…这仍然没有存储到数据库中…在插入之前尝试调试以查看存在哪些值,如果您尝试直接在服务器(Management Studio)上运行
INSERT
,它会工作吗?我们需要尝试并查明这是否是数据库问题(即,SQL server不允许您插入此行是有原因的)或者是代码问题。等等……我认为INSERT语句不起作用……我不知道为什么,因为以前它起作用了