connection()
{
OleDbConnection nwindConn=new OleDbConnection();
MySql.Data.MySqlClient.MySqlConnection con= new MySqlConnection();
MySqlCommand cmd;
con.ConnectionString ="server=localhost;" +
"uid=root;"+
"pwd=;" +
"database=globasys;" ;
DateTime dt=DateTime.Now;
string select = "SELECT CategoryID, CategoryName FROM categories";
MySqlDataAdapter catDA = new MySqlDataAdapter(select, con);
string insert = "insert into categories(CategoryID,CategoryName)
VALUES(@CategoryID,@CategoryName)
ON DUPLICATE KEY UPDATE CategoryID=@CategoryID";
catDA.InsertCommand = new MySqlCommand(insert, con);
catDA.InsertCommand.Parameters.Add("@CategoryID", MySqlDbType.Int32
, 11, "CategoryID");
catDA.InsertCommand.Parameters.Add("@CategoryName", MySqlDbType.VarChar
, 250, "CategoryName");
DataSet catDS = new DataSet();
catDA.MissingSchemaAction = MissingSchemaAction.AddWithKey;
catDA.Fill(catDS, "Categories");
DataSet newdt = new DataSet();
newdt = getnewdata();
int i= catDA.Update(newdt, "Categories");
}
public DataSet getnewdata()
{
DataSet catDS=new DataSet();
DataTable dt = new DataTable();
DataColumn col1 = new DataColumn("CategoryID", typeof(int));
dt.Columns.Add(col1);
DataColumn col=new DataColumn("CategoryName",typeof(string));
dt.Columns.Add(col);
DataColumn[] Cols = { dt.Columns[0] };
dt.PrimaryKey =Cols;
DataRow crow = dt.NewRow();
crow["CategoryID"]=1;
crow["CategoryName"]="io";
dt.Rows.Add(crow);
dt.TableName = "Categories";
DataRow crow1 = dt.NewRow();
crow1["CategoryID"] = 3;
crow1["CategoryName"] = "p";
dt.Rows.Add(crow1);
dt.TableName = "Categories";
catDS.Tables.Add(dt);
return catDS;
}
我希望insert命令ON DUPLICATE KEY UPDATE
使用新值更新旧值。如果值不存在则需要插入新值。
它确实执行,但它不会更新现有值
考虑我的表
1 a
2 b
使用此查询
INSERT INTO categories(CategoryID,CategoryName)
VALUES(1,qq) ON DUPLICATE KEY UPDATE CategoryID = 1
然后我希望结果是
1 qq
2 b
答案 0 :(得分:2)
您使用了错误的命令。
请改用此查询:
REPLACE INTO categories (CategoryID,CategoryName)
VALUES(1,qq);
以下是您的查询不起作用的原因
INSERT INTO categories(CategoryID,CategoryName)
VALUES(1,qq) ON DUPLICATE KEY UPDATE CategoryID = 1
此代码尝试将1插入CategoryID
,但不起作用,因为1已经在表中
接下来运行ON DUPLICATE KEY
子句
这会将CategoryID
设置为1
但是之前是1,它是1之后所以没有任何改变,你仍然试图插入一个重复的键。
之后,MySQL没有选择并且放弃了。
答案 1 :(得分:0)
您使用的是正确的陈述,但方式错误。
而不是
INSERT INTO categories(CategoryID,CategoryName)
VALUES(1,"qq") ON DUPLICATE KEY UPDATE CategoryID = 1
你应该写
INSERT INTO categories(CategoryID,CategoryName)
VALUES(1,"qq") ON DUPLICATE KEY UPDATE CategoryName = VALUES(CategoryName)
因为在关键字UPDATE
之后,您必须放置要更改的列,在您的情况下是CategoryName。 VALUES(CategoryName)
表示新值是您已为INSERT
声明的值 - 在示例中为" qq&#34 ;.
这是官方文件:http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html
由于多种原因,此声明优于REPLACE INTO
。例如,请参见此处:Insert into a MySQL table or update if exists