sql server -通过c#中的SqlDataAdapter和DataSet进行更新

本文关键字:DataSet 更新 SqlDataAdapter server -通过 中的 sql | 更新日期: 2023-09-27 17:50:44

我有以下代码

 string user = "new user";
 DataSet myDS = new DataSet();
        string sql = string.Format("Select Counter,Occupants From Rooms where Room = '{0}'",room);
        SqlDataAdapter dAdapt = new SqlDataAdapter(sql, cnn);
        dAdapt.Fill(myDS, "Rooms");
        foreach (DataTable dt in myDS.Tables)
        {
            int var =(int) dt.Rows[0].ItemArray[0];
            var--;
            dt.Rows[0].ItemArray[0] = var;
            String occups = dt.Rows[0].ItemArray[1].ToString();
            occups += user;
            dt.Rows[0].ItemArray[1] = occups;
        }
        dAdapt.Update(myDS,"Rooms");  

我正在检索一行两列——计数器(小int类型)和占用者(文本类型)。我得到一个错误,说数据类型文本和var char在等于操作符中不兼容,但错误指向行dAdapt.Fill(myDS, "Rooms");,这很奇怪。这是怎么了?我很确定db连接是打开的,因为我已经通过打印连接状态检查了它。

sql server -通过c#中的SqlDataAdapter和DataSet进行更新

除非您为DataAdaper指定了更新命令,否则这将无法工作。

我不会将记录加载到内存中来更新它。同时,它可能是从另一个交易中更改的。反正效率很低。相反,我将使用一个更新命令:

string updateSql = @"
    UPDATE ROOMS SET
        Counter = Counter + 1,
        Occupants = Occupants + ',' + @newUser
    WHERE
        Room = @Room";
using(var con = new SqlConnection(connectionString))
using (var updateCommand = new SqlCommand(updateSql, con))
{
    updateCommand.Parameters.AddWithValue("@newUser", user);
    updateCommand.Parameters.AddWithValue("@Room", room);
    con.Open();
    updateCommand.ExecuteNonQuery();
}

问题是在你的选择,因为你可以使用语法,那Room = 'something',因为文本不兼容=.

LIKE代替等号(=)

固定查询应该像:

SELECT Counter,Occupants FROM Rooms WHERE Room LIKE '{0}'

但是我建议使用SqlParameters而不是string.Format,因为它不安全