尝试将值插入数据库并获取最后插入的ID时出错

时间:2013-12-27 13:51:29

标签: c# asp.net web web-deployment

我正在使用C#在ASP.net中进行Web开发。

我正在尝试将一些值插入数据库并获取最后插入的ID。

这是我的代码:

int  userno2 =  Convert.ToInt32(Session["user_id"].ToString());
con = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ConnectionString);

createorder = new SqlDataAdapter("INSERT INTO order (user_id, date) VALUES ('" + userno2 + "', '12-12-2013');select SCOPE_IDENTITY();", con);
order = new DataSet();
createorder.Fill(order, "or_det");

Int32 ord_id = Convert.ToInt32(order.Tables[0].Rows[0]["order_id"].ToString());

当我尝试执行程序时,它会出错

  

关键字'order'附近的语法不正确。

任何人都可以帮我修复此错误吗?

3 个答案:

答案 0 :(得分:7)

order是SQL中的保留字。如果您使用的是SQL Server,请使用方括号将其转义为[]:

createorder = new SqlDataAdapter("INSERT INTO [order] (user_id, date) VALUES ('" + userno2 + "', '12-12-2013');select SCOPE_IDENTITY();", con);

答案 1 :(得分:5)

ORDER是T-SQL中的保留关键字。

要么不要调用你的表ORDER,要么你需要用方括号“转义”这个名字:

INSERT INTO [order](user_id, date) VALUES ('" + userno2 + "', '12-12-2013');select SCOPE_IDENTITY();", con);

另外:不要将这样的SQL语句串在一起!这对SQL注入攻击来说非常脆弱!

改为使用参数化查询

INSERT INTO [order](user_id, date) VALUES (@UserId, @Date);
SELECT SCOPE_IDENTITY();

要插入行并检索新插入的ID,我个人会使用简单的SqlCommand,而不是使用SqlDataAdapter

string insertStmt = "INSERT INTO [order](user_id, date) VALUES (@UserId, @Date); SELECT SCOPE_IDENTITY();";

using (SqlCommand insertCmd = new SqlCommand(insertStmt, yourSqlConnection))
{  
    insertCmd.Parameters.Add("@UserID", SqlDbType.Int).Value = xy;
    insertCmd.Parameters.Add("@Date", SqlDbType.DateTime).Value = DateTime.Now;

    yourSqlConnection.Open();
    int newID = (int)insertCmd.ExecuteScalar();
    yourSqlConnection.Close();
}

答案 2 :(得分:1)

除了marc_s回答之外,请不要使用dataset来获取单个值,而是使用ExecuteScalar方法。

string sql =
        "INSERT INTO [order] (user_id, date) VALUES (@user_id, @date); "
        + "SELECT CAST(scope_identity() AS int)";

     using (SqlConnection conn = new SqlConnection(connString))
        {

       using (SqlCommand cmd = new SqlCommand(sql , cmd))
         {
            cmd.Parameters.Add("@user_id", SqlDbType.VarChar);
            cmd.Parameters.Add("@date", SqlDbType.DateTime).Value = DateTime.Now;

            try
            {
                conn.Open();
                ord_id = (Int32)cmd.ExecuteScalar();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
         }
        }