【问题标题】:Insert, update in single statement在单个语句中插入、更新
【发布时间】:2016-10-10 09:36:58
【问题描述】:

我有两个表 table1 用于添加详细信息,table2 用于更新表 1 的 id。我的班级如下所示:

public bool SetData(List<Serialized> lstSerialized)
{
    string query = "IF NOT EXISTS(SELECT Fid from table1 where Fid=@Fid)" +
                "INSERT INTO table1(" +
                "id, " +
                "Name, " +
                "Fid ,"+                     
                "Detail) OUTPUT INSERTED.id VALUES (" +
                "@id, " +
                "@Name, " +
                "@Fid )"+
               "@Detail)"+
                "ELSE UPDATE table1 SET Name= @Name,Detail= @Detail WHERE Fid = @Fid ";

    return Data.CreateSerialized(lstSerialized, query);
}

public bool CreateSerialized(List<Serialized> lstSerialized, string query)
{
    try
    {
        int Id=0;

        using (SqlConnection con = new SqlConnection(conString))
        {
            using (SqlCommand cmd = new SqlCommand(query, con))
            {
                int id = GetMaxid();
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add("@id", SqlDbType.NVarChar).Value = id
                cmd.Parameters.Add("@Name", SqlDbType.NVarChar).Value = lstSerialized[0].Name;
                cmd.Parameters.Add("@Detail", SqlDbType.NVarChar).Value = lstSerialized[0].Detail;
                cmd.Parameters.Add("@Fid ", SqlDbType.Int).Value = lstSerialized[0].Fid;

                con.Open();

                Id= (int)cmd.ExecuteScalar();

                con.Close();
            }

            if (Id!=0)
            {
                using (SqlCommand command = new SqlCommand("update [table2] " +
                                                    "set Index=" + Id + " where " +
                                                    "[IndexID] = " + 9, con))
                {
                    con.Open();
                    int rowsAffected = command.ExecuteNonQuery();
                    con.Close();
                }
            }
        }
    }
    catch (Exception ex)
    {
        return false;
    }
    return true;
}

插入成功,但更新无法进行,显示错误“对象引用未设置为对象的实例”。我该如何解决这个问题?

【问题讨论】:

  • 您使用的是哪个 dbms?
  • 您的代码在@Detail)"+ 上缺少一个“。这是原因还是只是一个错字?
  • sql server 2012
  • 这个MERGE有一个特定的关键字

标签: c# sql ado.net


【解决方案1】:

您可以尝试像这样将对象转换为 int:

 object objId = cmd.ExecuteScalar();
 if (objId != null)
 {
  Id= (int)objId;
 }                              

【讨论】:

    【解决方案2】:

    在您的更新查询中没有任何选择语句。当

    Id= (int)cmd.ExecuteScalar();
    

    您尝试从此代码中转换 id,但无法转换您的 id。请处理这部分你会得到你的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-21
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2013-07-05
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多