- 补充 fsql.InsertOrUpdate IfExistsDoNothing 数据存在时不做任何事(不更新) #330 #316;

This commit is contained in:
28810
2020-07-18 11:58:58 +08:00
parent f97e7c21eb
commit 8d11993e6c
44 changed files with 5585 additions and 73 deletions

View File

@ -0,0 +1,425 @@
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.Odbc.Dameng
{
public class DamengInsertOrUpdateIfExistsNothingTest
{
IFreeSql fsql => g.dameng;
[Fact]
public void InsertOrUpdate_OnlyPrimary()
{
fsql.Delete<tbioudn01>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudn01>().IfExistsDoNothing().SetSource(new tbioudn01 { id = 1 });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN01"" t1
USING (SELECT 1 as ID FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"")
values (t2.ID)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn01>().IfExistsDoNothing().SetSource(new tbioudn01 { id = 1 });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN01"" t1
USING (SELECT 1 as ID FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"")
values (t2.ID)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn01>().IfExistsDoNothing().SetSource(new tbioudn01 { id = 2 });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN01"" t1
USING (SELECT 2 as ID FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"")
values (t2.ID)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn01>().IfExistsDoNothing().SetSource(new[] { new tbioudn01 { id = 1 }, new tbioudn01 { id = 2 }, new tbioudn01 { id = 3 }, new tbioudn01 { id = 4 } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN01"" t1
USING (SELECT 1 as ID FROM dual
UNION ALL
SELECT 2 FROM dual
UNION ALL
SELECT 3 FROM dual
UNION ALL
SELECT 4 FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"")
values (t2.ID)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn01>().IfExistsDoNothing().SetSource(new[] { new tbioudn01 { id = 1 }, new tbioudn01 { id = 2 }, new tbioudn01 { id = 3 }, new tbioudn01 { id = 4 } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN01"" t1
USING (SELECT 1 as ID FROM dual
UNION ALL
SELECT 2 FROM dual
UNION ALL
SELECT 3 FROM dual
UNION ALL
SELECT 4 FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"")
values (t2.ID)", sql);
iou.ExecuteAffrows();
}
class tbioudn01
{
public int id { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimary()
{
fsql.Delete<tbioudn02>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudn02>().IfExistsDoNothing().SetSource(new tbioudn02 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN02"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn02>().IfExistsDoNothing().SetSource(new tbioudn02 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN02"" t1
USING (SELECT 1 as ID, '011' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn02>().IfExistsDoNothing().SetSource(new tbioudn02 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN02"" t1
USING (SELECT 2 as ID, '02' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn02>().IfExistsDoNothing().SetSource(new[] { new tbioudn02 { id = 1, name = "01" }, new tbioudn02 { id = 2, name = "02" }, new tbioudn02 { id = 3, name = "03" }, new tbioudn02 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN02"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual
UNION ALL
SELECT 2, '02' FROM dual
UNION ALL
SELECT 3, '03' FROM dual
UNION ALL
SELECT 4, '04' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn02>().IfExistsDoNothing().SetSource(new[] { new tbioudn02 { id = 1, name = "001" }, new tbioudn02 { id = 2, name = "002" }, new tbioudn02 { id = 3, name = "003" }, new tbioudn02 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN02"" t1
USING (SELECT 1 as ID, '001' as NAME FROM dual
UNION ALL
SELECT 2, '002' FROM dual
UNION ALL
SELECT 3, '003' FROM dual
UNION ALL
SELECT 4, '004' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
var lst = fsql.Select<tbioudn02>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudn02
{
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbioudn022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudn022>().IfExistsDoNothing().SetSource(new tbioudn022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN022"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn022>().IfExistsDoNothing().SetSource(new tbioudn022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN022"" t1
USING (SELECT 1 as ID, '011' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn022>().IfExistsDoNothing().SetSource(new tbioudn022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN022"" t1
USING (SELECT 2 as ID, '02' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn022>().IfExistsDoNothing().SetSource(new[] { new tbioudn022 { id = 1, name = "01" }, new tbioudn022 { id = 2, name = "02" }, new tbioudn022 { id = 3, name = "03" }, new tbioudn022 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN022"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual
UNION ALL
SELECT 2, '02' FROM dual
UNION ALL
SELECT 3, '03' FROM dual
UNION ALL
SELECT 4, '04' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn022>().IfExistsDoNothing().SetSource(new[] { new tbioudn022 { id = 1, name = "001" }, new tbioudn022 { id = 2, name = "002" }, new tbioudn022 { id = 3, name = "003" }, new tbioudn022 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN022"" t1
USING (SELECT 1 as ID, '001' as NAME FROM dual
UNION ALL
SELECT 2, '002' FROM dual
UNION ALL
SELECT 3, '003' FROM dual
UNION ALL
SELECT 4, '004' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
var lst = fsql.Select<tbioudn022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
//Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbioudn022>().IfExistsDoNothing().SetSource(new tbioudn022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDN022""(""NAME"") VALUES('01')", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn022>().IfExistsDoNothing().SetSource(new tbioudn022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDN022""(""NAME"") VALUES('011')", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn022>().IfExistsDoNothing().SetSource(new tbioudn022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDN022""(""NAME"") VALUES('02')", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn022>().IfExistsDoNothing().SetSource(new[] { new tbioudn022 { name = "01" }, new tbioudn022 { name = "02" }, new tbioudn022 { name = "03" }, new tbioudn022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT ALL
INTO ""TBIOUDN022""(""NAME"") VALUES('01')
INTO ""TBIOUDN022""(""NAME"") VALUES('02')
INTO ""TBIOUDN022""(""NAME"") VALUES('03')
INTO ""TBIOUDN022""(""NAME"") VALUES('04')
SELECT 1 FROM DUAL", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn022>().IfExistsDoNothing().SetSource(new[] { new tbioudn022 { name = "001" }, new tbioudn022 { name = "002" }, new tbioudn022 { name = "003" }, new tbioudn022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT ALL
INTO ""TBIOUDN022""(""NAME"") VALUES('001')
INTO ""TBIOUDN022""(""NAME"") VALUES('002')
INTO ""TBIOUDN022""(""NAME"") VALUES('003')
INTO ""TBIOUDN022""(""NAME"") VALUES('004')
SELECT 1 FROM DUAL", sql);
iou.ExecuteAffrows();
//--no primary and yes
iou = fsql.InsertOrUpdate<tbioudn022>().IfExistsDoNothing().SetSource(new[] { new tbioudn022 { id = 1, name = "100001" }, new tbioudn022 { name = "00001" }, new tbioudn022 { id = 2, name = "100002" }, new tbioudn022 { name = "00002" }, new tbioudn022 { id = 3, name = "100003" }, new tbioudn022 { name = "00003" }, new tbioudn022 { id = 4, name = "100004" }, new tbioudn022 { name = "00004" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN022"" t1
USING (SELECT 1 as ID, '100001' as NAME FROM dual
UNION ALL
SELECT 2, '100002' FROM dual
UNION ALL
SELECT 3, '100003' FROM dual
UNION ALL
SELECT 4, '100004' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)
;
INSERT ALL
INTO ""TBIOUDN022""(""NAME"") VALUES('00001')
INTO ""TBIOUDN022""(""NAME"") VALUES('00002')
INTO ""TBIOUDN022""(""NAME"") VALUES('00003')
INTO ""TBIOUDN022""(""NAME"") VALUES('00004')
SELECT 1 FROM DUAL", sql);
iou.ExecuteAffrows();
lst = fsql.Select<tbioudn022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
//Assert.Equal(4, lst.Where(a => a.name == "10000" + a.id).Count());
}
class tbioudn022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()
{
fsql.Delete<tbioudn03>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudn03>().IfExistsDoNothing().SetSource(new tbioudn03 { id1 = 1, id2 = "01", name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN03"" t1
USING (SELECT 1 as ID1, '01' as ID2, '01' as NAME FROM dual ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
WHEN NOT MATCHED THEN
insert (""ID1"", ""ID2"", ""NAME"")
values (t2.ID1, t2.ID2, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn03>().IfExistsDoNothing().SetSource(new tbioudn03 { id1 = 1, id2 = "02", name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN03"" t1
USING (SELECT 1 as ID1, '02' as ID2, '011' as NAME FROM dual ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
WHEN NOT MATCHED THEN
insert (""ID1"", ""ID2"", ""NAME"")
values (t2.ID1, t2.ID2, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn03>().IfExistsDoNothing().SetSource(new tbioudn03 { id1 = 2, id2 = "02", name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN03"" t1
USING (SELECT 2 as ID1, '02' as ID2, '02' as NAME FROM dual ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
WHEN NOT MATCHED THEN
insert (""ID1"", ""ID2"", ""NAME"")
values (t2.ID1, t2.ID2, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn03>().IfExistsDoNothing().SetSource(new[] { new tbioudn03 { id1 = 1, id2 = "01", name = "01" }, new tbioudn03 { id1 = 2, id2 = "02", name = "02" }, new tbioudn03 { id1 = 3, id2 = "03", name = "03" }, new tbioudn03 { id1 = 4, id2 = "04", name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN03"" t1
USING (SELECT 1 as ID1, '01' as ID2, '01' as NAME FROM dual
UNION ALL
SELECT 2, '02', '02' FROM dual
UNION ALL
SELECT 3, '03', '03' FROM dual
UNION ALL
SELECT 4, '04', '04' FROM dual ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
WHEN NOT MATCHED THEN
insert (""ID1"", ""ID2"", ""NAME"")
values (t2.ID1, t2.ID2, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn03>().IfExistsDoNothing().SetSource(new[] { new tbioudn03 { id1 = 1, id2 = "01", name = "001" }, new tbioudn03 { id1 = 2, id2 = "02", name = "002" }, new tbioudn03 { id1 = 3, id2 = "03", name = "003" }, new tbioudn03 { id1 = 4, id2 = "04", name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN03"" t1
USING (SELECT 1 as ID1, '01' as ID2, '001' as NAME FROM dual
UNION ALL
SELECT 2, '02', '002' FROM dual
UNION ALL
SELECT 3, '03', '003' FROM dual
UNION ALL
SELECT 4, '04', '004' FROM dual ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
WHEN NOT MATCHED THEN
insert (""ID1"", ""ID2"", ""NAME"")
values (t2.ID1, t2.ID2, t2.NAME)", sql);
iou.ExecuteAffrows();
var lst = fsql.Select<tbioudn03>().Where(a => a.id1 == 1 && a.id2 == "01" || a.id1 == 2 && a.id2 == "02" || a.id1 == 3 && a.id2 == "03" || a.id1 == 4 && a.id2 == "04").ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id1).Count());
}
class tbioudn03
{
[Column(IsPrimary = true)]
public int id1 { get; set; }
[Column(IsPrimary = true)]
public string id2 { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndVersionAndCanUpdate()
{
fsql.Delete<tbioudn04>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudn04>().IfExistsDoNothing().SetSource(new tbioudn04 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN04"" t1
USING (SELECT 1 as ID, '01' as NAME, 0 as VERSION, systimestamp as CREATETIME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"", ""VERSION"", ""CREATETIME"")
values (t2.ID, t2.NAME, t2.VERSION, t2.CREATETIME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn04>().IfExistsDoNothing().SetSource(new tbioudn04 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN04"" t1
USING (SELECT 1 as ID, '011' as NAME, 0 as VERSION, systimestamp as CREATETIME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"", ""VERSION"", ""CREATETIME"")
values (t2.ID, t2.NAME, t2.VERSION, t2.CREATETIME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn04>().IfExistsDoNothing().SetSource(new tbioudn04 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN04"" t1
USING (SELECT 2 as ID, '02' as NAME, 0 as VERSION, systimestamp as CREATETIME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"", ""VERSION"", ""CREATETIME"")
values (t2.ID, t2.NAME, t2.VERSION, t2.CREATETIME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn04>().IfExistsDoNothing().SetSource(new[] { new tbioudn04 { id = 1, name = "01" }, new tbioudn04 { id = 2, name = "02" }, new tbioudn04 { id = 3, name = "03" }, new tbioudn04 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN04"" t1
USING (SELECT 1 as ID, '01' as NAME, 0 as VERSION, systimestamp as CREATETIME FROM dual
UNION ALL
SELECT 2, '02', 0, systimestamp FROM dual
UNION ALL
SELECT 3, '03', 0, systimestamp FROM dual
UNION ALL
SELECT 4, '04', 0, systimestamp FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"", ""VERSION"", ""CREATETIME"")
values (t2.ID, t2.NAME, t2.VERSION, t2.CREATETIME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudn04>().IfExistsDoNothing().SetSource(new[] { new tbioudn04 { id = 1, name = "001" }, new tbioudn04 { id = 2, name = "002" }, new tbioudn04 { id = 3, name = "003" }, new tbioudn04 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDN04"" t1
USING (SELECT 1 as ID, '001' as NAME, 0 as VERSION, systimestamp as CREATETIME FROM dual
UNION ALL
SELECT 2, '002', 0, systimestamp FROM dual
UNION ALL
SELECT 3, '003', 0, systimestamp FROM dual
UNION ALL
SELECT 4, '004', 0, systimestamp FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"", ""VERSION"", ""CREATETIME"")
values (t2.ID, t2.NAME, t2.VERSION, t2.CREATETIME)", sql);
iou.ExecuteAffrows();
var lst = fsql.Select<tbioudn04>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudn04
{
public int id { get; set; }
public string name { get; set; }
[Column(IsVersion = true)]
public int version { get; set; }
[Column(CanUpdate = false, ServerTime = DateTimeKind.Local)]
public DateTime CreateTime { get; set; }
}
}
}

View File

@ -313,10 +313,10 @@ WHEN NOT MATCHED THEN
values (t2.ID1, t2.ID2, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou03>().SetSource(new tbiou03 { id1 = 1, id2 = "02", name = "011" });
iou = fsql.InsertOrUpdate<tbiou03>().SetSource(new tbiou03 { id1 = 1, id2 = "01", name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOU03"" t1
USING (SELECT 1 as ID1, '02' as ID2, '011' as NAME FROM dual ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
USING (SELECT 1 as ID1, '01' as ID2, '011' as NAME FROM dual ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN

View File

@ -0,0 +1,266 @@
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.Odbc.KingbaseES
{
public class KingbaseESInsertOrUpdateIfExistsDoNotingTest
{
IFreeSql fsql => g.kingbaseES;
[Fact]
public void InsertOrUpdate_OnlyPrimary()
{
fsql.Delete<tbioudb01>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new tbioudb01 { id = 1 });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB01""(""ID"") VALUES(1)
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new tbioudb01 { id = 1 });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB01""(""ID"") VALUES(1)
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new tbioudb01 { id = 2 });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB01""(""ID"") VALUES(2)
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new[] { new tbioudb01 { id = 1 }, new tbioudb01 { id = 2 }, new tbioudb01 { id = 3 }, new tbioudb01 { id = 4 } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB01""(""ID"") VALUES(1), (2), (3), (4)
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new[] { new tbioudb01 { id = 1 }, new tbioudb01 { id = 2 }, new tbioudb01 { id = 3 }, new tbioudb01 { id = 4 } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB01""(""ID"") VALUES(1), (2), (3), (4)
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
}
class tbioudb01
{
public int id { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimary()
{
fsql.Delete<tbioudb02>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB02""(""ID"", ""NAME"") VALUES(1, '01')
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB02""(""ID"", ""NAME"") VALUES(1, '011')
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB02""(""ID"", ""NAME"") VALUES(2, '02')
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "01" }, new tbioudb02 { id = 2, name = "02" }, new tbioudb02 { id = 3, name = "03" }, new tbioudb02 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB02""(""ID"", ""NAME"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "001" }, new tbioudb02 { id = 2, name = "002" }, new tbioudb02 { id = 3, name = "003" }, new tbioudb02 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB02""(""ID"", ""NAME"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb02>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb02
{
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbioudb022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB022""(""ID"", ""NAME"") VALUES(1, '01')
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB022""(""ID"", ""NAME"") VALUES(1, '011')
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB022""(""ID"", ""NAME"") VALUES(2, '02')
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "01" }, new tbioudb022 { id = 2, name = "02" }, new tbioudb022 { id = 3, name = "03" }, new tbioudb022 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB022""(""ID"", ""NAME"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "001" }, new tbioudb022 { id = 2, name = "002" }, new tbioudb022 { id = 3, name = "003" }, new tbioudb022 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB022""(""ID"", ""NAME"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB022""(""NAME"") VALUES('01')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB022""(""NAME"") VALUES('011')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB022""(""NAME"") VALUES('02')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { name = "01" }, new tbioudb022 { name = "02" }, new tbioudb022 { name = "03" }, new tbioudb022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB022""(""NAME"") VALUES('01'), ('02'), ('03'), ('04')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { name = "001" }, new tbioudb022 { name = "002" }, new tbioudb022 { name = "003" }, new tbioudb022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB022""(""NAME"") VALUES('001'), ('002'), ('003'), ('004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
//--no primary and yes
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "100001" }, new tbioudb022 { name = "00001" }, new tbioudb022 { id = 2, name = "100002" }, new tbioudb022 { name = "00002" }, new tbioudb022 { id = 3, name = "100003" }, new tbioudb022 { name = "00003" }, new tbioudb022 { id = 4, name = "100004" }, new tbioudb022 { name = "00004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB022""(""ID"", ""NAME"") VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004')
ON CONFLICT(""ID"") DO NOTHING
;
INSERT INTO ""TBIOUDB022""(""NAME"") VALUES('00001'), ('00002'), ('00003'), ('00004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
lst = fsql.Select<tbioudb022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()
{
fsql.Delete<tbioudb03>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB03""(""ID1"", ""ID2"", ""NAME"") VALUES(1, '01', '01')
ON CONFLICT(""ID1"", ""ID2"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB03""(""ID1"", ""ID2"", ""NAME"") VALUES(1, '01', '011')
ON CONFLICT(""ID1"", ""ID2"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 2, id2 = "02", name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB03""(""ID1"", ""ID2"", ""NAME"") VALUES(2, '02', '02')
ON CONFLICT(""ID1"", ""ID2"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "01" }, new tbioudb03 { id1 = 2, id2 = "02", name = "02" }, new tbioudb03 { id1 = 3, id2 = "03", name = "03" }, new tbioudb03 { id1 = 4, id2 = "04", name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB03""(""ID1"", ""ID2"", ""NAME"") VALUES(1, '01', '01'), (2, '02', '02'), (3, '03', '03'), (4, '04', '04')
ON CONFLICT(""ID1"", ""ID2"") DO NOTHING", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "001" }, new tbioudb03 { id1 = 2, id2 = "02", name = "002" }, new tbioudb03 { id1 = 3, id2 = "03", name = "003" }, new tbioudb03 { id1 = 4, id2 = "04", name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB03""(""ID1"", ""ID2"", ""NAME"") VALUES(1, '01', '001'), (2, '02', '002'), (3, '03', '003'), (4, '04', '004')
ON CONFLICT(""ID1"", ""ID2"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb03>().Where(a => a.id1 == 1 && a.id2 == "01" || a.id1 == 2 && a.id2 == "02" || a.id1 == 3 && a.id2 == "03" || a.id1 == 4 && a.id2 == "04").ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id1).Count());
}
class tbioudb03
{
[Column(IsPrimary = true)]
public int id1 { get; set; }
[Column(IsPrimary = true)]
public string id2 { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndVersionAndCanUpdate()
{
fsql.Delete<tbioudb04>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB04""(""ID"", ""NAME"", ""VERSION"", ""CREATETIME"") VALUES(1, '01', 0, current_timestamp)
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB04""(""ID"", ""NAME"", ""VERSION"", ""CREATETIME"") VALUES(1, '011', 0, current_timestamp)
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB04""(""ID"", ""NAME"", ""VERSION"", ""CREATETIME"") VALUES(2, '02', 0, current_timestamp)
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "01" }, new tbioudb04 { id = 2, name = "02" }, new tbioudb04 { id = 3, name = "03" }, new tbioudb04 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB04""(""ID"", ""NAME"", ""VERSION"", ""CREATETIME"") VALUES(1, '01', 0, current_timestamp), (2, '02', 0, current_timestamp), (3, '03', 0, current_timestamp), (4, '04', 0, current_timestamp)
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "001" }, new tbioudb04 { id = 2, name = "002" }, new tbioudb04 { id = 3, name = "003" }, new tbioudb04 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB04""(""ID"", ""NAME"", ""VERSION"", ""CREATETIME"") VALUES(1, '001', 0, current_timestamp), (2, '002', 0, current_timestamp), (3, '003', 0, current_timestamp), (4, '004', 0, current_timestamp)
ON CONFLICT(""ID"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb04>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb04
{
public int id { get; set; }
public string name { get; set; }
[Column(IsVersion = true)]
public int version { get; set; }
[Column(CanUpdate = false, ServerTime = DateTimeKind.Local)]
public DateTime CreateTime { get; set; }
}
}
}

View File

@ -107,9 +107,9 @@ ON CONFLICT(""ID1"", ""ID2"") DO UPDATE SET
""NAME"" = EXCLUDED.""NAME""", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou03>().SetSource(new tbiou03 { id1 = 1, id2 = "02", name = "011" });
iou = fsql.InsertOrUpdate<tbiou03>().SetSource(new tbiou03 { id1 = 1, id2 = "01", name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOU03""(""ID1"", ""ID2"", ""NAME"") VALUES(1, '02', '011')
Assert.Equal(@"INSERT INTO ""TBIOU03""(""ID1"", ""ID2"", ""NAME"") VALUES(1, '01', '011')
ON CONFLICT(""ID1"", ""ID2"") DO UPDATE SET
""NAME"" = EXCLUDED.""NAME""", sql);
Assert.Equal(1, iou.ExecuteAffrows());

View File

@ -0,0 +1,453 @@
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.Odbc.MySql
{
public class MySqlInsertOrUpdateIfExistsDoNothingTest
{
IFreeSql fsql => g.mysql;
[Fact]
public void InsertOrUpdate_OnePrimary()
{
fsql.Delete<tbioudb02>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '01'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb02` a
WHERE (a.`id` = 1)
limit 0,1)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '011'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb02` a
WHERE (a.`id` = 1)
limit 0,1)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 2, '02'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb02` a
WHERE (a.`id` = 2)
limit 0,1)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "01" }, new tbioudb02 { id = 2, name = "02" }, new tbioudb02 { id = 3, name = "03" }, new tbioudb02 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '01'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb02` a
WHERE (a.`id` = 1)
limit 0,1)
UNION ALL
SELECT 2, '02'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb02` a
WHERE (a.`id` = 2)
limit 0,1)
UNION ALL
SELECT 3, '03'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb02` a
WHERE (a.`id` = 3)
limit 0,1)
UNION ALL
SELECT 4, '04'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb02` a
WHERE (a.`id` = 4)
limit 0,1)", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "001" }, new tbioudb02 { id = 2, name = "002" }, new tbioudb02 { id = 3, name = "003" }, new tbioudb02 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '001'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb02` a
WHERE (a.`id` = 1)
limit 0,1)
UNION ALL
SELECT 2, '002'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb02` a
WHERE (a.`id` = 2)
limit 0,1)
UNION ALL
SELECT 3, '003'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb02` a
WHERE (a.`id` = 3)
limit 0,1)
UNION ALL
SELECT 4, '004'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb02` a
WHERE (a.`id` = 4)
limit 0,1)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb02>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb02
{
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbioudb022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '01'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb022` a
WHERE (a.`id` = 1)
limit 0,1)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '011'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb022` a
WHERE (a.`id` = 1)
limit 0,1)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 2, '02'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb022` a
WHERE (a.`id` = 2)
limit 0,1)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "01" }, new tbioudb022 { id = 2, name = "02" }, new tbioudb022 { id = 3, name = "03" }, new tbioudb022 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '01'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb022` a
WHERE (a.`id` = 1)
limit 0,1)
UNION ALL
SELECT 2, '02'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb022` a
WHERE (a.`id` = 2)
limit 0,1)
UNION ALL
SELECT 3, '03'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb022` a
WHERE (a.`id` = 3)
limit 0,1)
UNION ALL
SELECT 4, '04'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb022` a
WHERE (a.`id` = 4)
limit 0,1)", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "001" }, new tbioudb022 { id = 2, name = "002" }, new tbioudb022 { id = 3, name = "003" }, new tbioudb022 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '001'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb022` a
WHERE (a.`id` = 1)
limit 0,1)
UNION ALL
SELECT 2, '002'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb022` a
WHERE (a.`id` = 2)
limit 0,1)
UNION ALL
SELECT 3, '003'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb022` a
WHERE (a.`id` = 3)
limit 0,1)
UNION ALL
SELECT 4, '004'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb022` a
WHERE (a.`id` = 4)
limit 0,1)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb022`(`name`) VALUES('01')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb022`(`name`) VALUES('011')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb022`(`name`) VALUES('02')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { name = "01" }, new tbioudb022 { name = "02" }, new tbioudb022 { name = "03" }, new tbioudb022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb022`(`name`) VALUES('01'), ('02'), ('03'), ('04')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { name = "001" }, new tbioudb022 { name = "002" }, new tbioudb022 { name = "003" }, new tbioudb022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb022`(`name`) VALUES('001'), ('002'), ('003'), ('004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
//--no primary and yes
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "100001" }, new tbioudb022 { name = "00001" }, new tbioudb022 { id = 2, name = "100002" }, new tbioudb022 { name = "00002" }, new tbioudb022 { id = 3, name = "100003" }, new tbioudb022 { name = "00003" }, new tbioudb022 { id = 4, name = "100004" }, new tbioudb022 { name = "00004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '100001'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb022` a
WHERE (a.`id` = 1)
limit 0,1)
UNION ALL
SELECT 2, '100002'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb022` a
WHERE (a.`id` = 2)
limit 0,1)
UNION ALL
SELECT 3, '100003'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb022` a
WHERE (a.`id` = 3)
limit 0,1)
UNION ALL
SELECT 4, '100004'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb022` a
WHERE (a.`id` = 4)
limit 0,1)
;
INSERT INTO `tbioudb022`(`name`) VALUES('00001'), ('00002'), ('00003'), ('00004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
lst = fsql.Select<tbioudb022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()
{
fsql.Delete<tbioudb03>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '01'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb03` a
WHERE (a.`id1` = 1 AND a.`id2` = '01')
limit 0,1)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '011'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb03` a
WHERE (a.`id1` = 1 AND a.`id2` = '01')
limit 0,1)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 2, id2 = "02", name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 2, '02', '02'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb03` a
WHERE (a.`id1` = 2 AND a.`id2` = '02')
limit 0,1)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "01" }, new tbioudb03 { id1 = 2, id2 = "02", name = "02" }, new tbioudb03 { id1 = 3, id2 = "03", name = "03" }, new tbioudb03 { id1 = 4, id2 = "04", name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '01'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb03` a
WHERE (a.`id1` = 1 AND a.`id2` = '01')
limit 0,1)
UNION ALL
SELECT 2, '02', '02'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb03` a
WHERE (a.`id1` = 2 AND a.`id2` = '02')
limit 0,1)
UNION ALL
SELECT 3, '03', '03'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb03` a
WHERE (a.`id1` = 3 AND a.`id2` = '03')
limit 0,1)
UNION ALL
SELECT 4, '04', '04'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb03` a
WHERE (a.`id1` = 4 AND a.`id2` = '04')
limit 0,1)", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "001" }, new tbioudb03 { id1 = 2, id2 = "02", name = "002" }, new tbioudb03 { id1 = 3, id2 = "03", name = "003" }, new tbioudb03 { id1 = 4, id2 = "04", name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '001'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb03` a
WHERE (a.`id1` = 1 AND a.`id2` = '01')
limit 0,1)
UNION ALL
SELECT 2, '02', '002'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb03` a
WHERE (a.`id1` = 2 AND a.`id2` = '02')
limit 0,1)
UNION ALL
SELECT 3, '03', '003'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb03` a
WHERE (a.`id1` = 3 AND a.`id2` = '03')
limit 0,1)
UNION ALL
SELECT 4, '04', '004'
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb03` a
WHERE (a.`id1` = 4 AND a.`id2` = '04')
limit 0,1)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb03>().Where(a => a.id1 == 1 && a.id2 == "01" || a.id1 == 2 && a.id2 == "02" || a.id1 == 3 && a.id2 == "03" || a.id1 == 4 && a.id2 == "04").ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id1).Count());
}
class tbioudb03
{
[Column(IsPrimary = true)]
public int id1 { get; set; }
[Column(IsPrimary = true)]
public string id2 { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndVersionAndCanUpdate()
{
fsql.Delete<tbioudb04>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '01', 0, now(3)
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb04` a
WHERE (a.`id` = 1)
limit 0,1)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '011', 0, now(3)
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb04` a
WHERE (a.`id` = 1)
limit 0,1)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 2, '02', 0, now(3)
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb04` a
WHERE (a.`id` = 2)
limit 0,1)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "01" }, new tbioudb04 { id = 2, name = "02" }, new tbioudb04 { id = 3, name = "03" }, new tbioudb04 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '01', 0, now(3)
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb04` a
WHERE (a.`id` = 1)
limit 0,1)
UNION ALL
SELECT 2, '02', 0, now(3)
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb04` a
WHERE (a.`id` = 2)
limit 0,1)
UNION ALL
SELECT 3, '03', 0, now(3)
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb04` a
WHERE (a.`id` = 3)
limit 0,1)
UNION ALL
SELECT 4, '04', 0, now(3)
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb04` a
WHERE (a.`id` = 4)
limit 0,1)", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "001" }, new tbioudb04 { id = 2, name = "002" }, new tbioudb04 { id = 3, name = "003" }, new tbioudb04 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '001', 0, now(3)
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb04` a
WHERE (a.`id` = 1)
limit 0,1)
UNION ALL
SELECT 2, '002', 0, now(3)
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb04` a
WHERE (a.`id` = 2)
limit 0,1)
UNION ALL
SELECT 3, '003', 0, now(3)
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb04` a
WHERE (a.`id` = 3)
limit 0,1)
UNION ALL
SELECT 4, '004', 0, now(3)
FROM dual WHERE NOT EXISTS(SELECT 1
FROM `tbioudb04` a
WHERE (a.`id` = 4)
limit 0,1)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb04>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb04
{
public int id { get; set; }
public string name { get; set; }
[Column(IsVersion = true)]
public int version { get; set; }
[Column(CanUpdate = false, ServerTime = DateTimeKind.Local)]
public DateTime CreateTime { get; set; }
}
}
}

View File

@ -0,0 +1,425 @@
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.Odbc.Oracle
{
public class OracleInsertOrUpdateIfExistsDoNothingTest
{
IFreeSql fsql => g.oracle;
[Fact]
public void InsertOrUpdate_OnlyPrimary()
{
fsql.Delete<tbioudb01>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new tbioudb01 { id = 1 });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB01"" t1
USING (SELECT 1 as ID FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"")
values (t2.ID)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new tbioudb01 { id = 1 });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB01"" t1
USING (SELECT 1 as ID FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"")
values (t2.ID)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new tbioudb01 { id = 2 });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB01"" t1
USING (SELECT 2 as ID FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"")
values (t2.ID)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new[] { new tbioudb01 { id = 1 }, new tbioudb01 { id = 2 }, new tbioudb01 { id = 3 }, new tbioudb01 { id = 4 } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB01"" t1
USING (SELECT 1 as ID FROM dual
UNION ALL
SELECT 2 FROM dual
UNION ALL
SELECT 3 FROM dual
UNION ALL
SELECT 4 FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"")
values (t2.ID)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new[] { new tbioudb01 { id = 1 }, new tbioudb01 { id = 2 }, new tbioudb01 { id = 3 }, new tbioudb01 { id = 4 } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB01"" t1
USING (SELECT 1 as ID FROM dual
UNION ALL
SELECT 2 FROM dual
UNION ALL
SELECT 3 FROM dual
UNION ALL
SELECT 4 FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"")
values (t2.ID)", sql);
iou.ExecuteAffrows();
}
class tbioudb01
{
public int id { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimary()
{
fsql.Delete<tbioudb02>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB02"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB02"" t1
USING (SELECT 1 as ID, '011' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB02"" t1
USING (SELECT 2 as ID, '02' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "01" }, new tbioudb02 { id = 2, name = "02" }, new tbioudb02 { id = 3, name = "03" }, new tbioudb02 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB02"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual
UNION ALL
SELECT 2, '02' FROM dual
UNION ALL
SELECT 3, '03' FROM dual
UNION ALL
SELECT 4, '04' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "001" }, new tbioudb02 { id = 2, name = "002" }, new tbioudb02 { id = 3, name = "003" }, new tbioudb02 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB02"" t1
USING (SELECT 1 as ID, '001' as NAME FROM dual
UNION ALL
SELECT 2, '002' FROM dual
UNION ALL
SELECT 3, '003' FROM dual
UNION ALL
SELECT 4, '004' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
var lst = fsql.Select<tbioudb02>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb02
{
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbioudb022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB022"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB022"" t1
USING (SELECT 1 as ID, '011' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB022"" t1
USING (SELECT 2 as ID, '02' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "01" }, new tbioudb022 { id = 2, name = "02" }, new tbioudb022 { id = 3, name = "03" }, new tbioudb022 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB022"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual
UNION ALL
SELECT 2, '02' FROM dual
UNION ALL
SELECT 3, '03' FROM dual
UNION ALL
SELECT 4, '04' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "001" }, new tbioudb022 { id = 2, name = "002" }, new tbioudb022 { id = 3, name = "003" }, new tbioudb022 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB022"" t1
USING (SELECT 1 as ID, '001' as NAME FROM dual
UNION ALL
SELECT 2, '002' FROM dual
UNION ALL
SELECT 3, '003' FROM dual
UNION ALL
SELECT 4, '004' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
var lst = fsql.Select<tbioudb022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
//Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB022""(""NAME"") VALUES('01')", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB022""(""NAME"") VALUES('011')", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOUDB022""(""NAME"") VALUES('02')", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { name = "01" }, new tbioudb022 { name = "02" }, new tbioudb022 { name = "03" }, new tbioudb022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT ALL
INTO ""TBIOUDB022""(""NAME"") VALUES('01')
INTO ""TBIOUDB022""(""NAME"") VALUES('02')
INTO ""TBIOUDB022""(""NAME"") VALUES('03')
INTO ""TBIOUDB022""(""NAME"") VALUES('04')
SELECT 1 FROM DUAL", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { name = "001" }, new tbioudb022 { name = "002" }, new tbioudb022 { name = "003" }, new tbioudb022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT ALL
INTO ""TBIOUDB022""(""NAME"") VALUES('001')
INTO ""TBIOUDB022""(""NAME"") VALUES('002')
INTO ""TBIOUDB022""(""NAME"") VALUES('003')
INTO ""TBIOUDB022""(""NAME"") VALUES('004')
SELECT 1 FROM DUAL", sql);
iou.ExecuteAffrows();
//--no primary and yes
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "100001" }, new tbioudb022 { name = "00001" }, new tbioudb022 { id = 2, name = "100002" }, new tbioudb022 { name = "00002" }, new tbioudb022 { id = 3, name = "100003" }, new tbioudb022 { name = "00003" }, new tbioudb022 { id = 4, name = "100004" }, new tbioudb022 { name = "00004" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB022"" t1
USING (SELECT 1 as ID, '100001' as NAME FROM dual
UNION ALL
SELECT 2, '100002' FROM dual
UNION ALL
SELECT 3, '100003' FROM dual
UNION ALL
SELECT 4, '100004' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)
;
INSERT ALL
INTO ""TBIOUDB022""(""NAME"") VALUES('00001')
INTO ""TBIOUDB022""(""NAME"") VALUES('00002')
INTO ""TBIOUDB022""(""NAME"") VALUES('00003')
INTO ""TBIOUDB022""(""NAME"") VALUES('00004')
SELECT 1 FROM DUAL", sql);
iou.ExecuteAffrows();
lst = fsql.Select<tbioudb022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
//Assert.Equal(4, lst.Where(a => a.name == "10000" + a.id).Count());
}
class tbioudb022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()
{
fsql.Delete<tbioudb03>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB03"" t1
USING (SELECT 1 as ID1, '01' as ID2, '01' as NAME FROM dual ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
WHEN NOT MATCHED THEN
insert (""ID1"", ""ID2"", ""NAME"")
values (t2.ID1, t2.ID2, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB03"" t1
USING (SELECT 1 as ID1, '01' as ID2, '011' as NAME FROM dual ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
WHEN NOT MATCHED THEN
insert (""ID1"", ""ID2"", ""NAME"")
values (t2.ID1, t2.ID2, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 2, id2 = "02", name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB03"" t1
USING (SELECT 2 as ID1, '02' as ID2, '02' as NAME FROM dual ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
WHEN NOT MATCHED THEN
insert (""ID1"", ""ID2"", ""NAME"")
values (t2.ID1, t2.ID2, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "01" }, new tbioudb03 { id1 = 2, id2 = "02", name = "02" }, new tbioudb03 { id1 = 3, id2 = "03", name = "03" }, new tbioudb03 { id1 = 4, id2 = "04", name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB03"" t1
USING (SELECT 1 as ID1, '01' as ID2, '01' as NAME FROM dual
UNION ALL
SELECT 2, '02', '02' FROM dual
UNION ALL
SELECT 3, '03', '03' FROM dual
UNION ALL
SELECT 4, '04', '04' FROM dual ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
WHEN NOT MATCHED THEN
insert (""ID1"", ""ID2"", ""NAME"")
values (t2.ID1, t2.ID2, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "001" }, new tbioudb03 { id1 = 2, id2 = "02", name = "002" }, new tbioudb03 { id1 = 3, id2 = "03", name = "003" }, new tbioudb03 { id1 = 4, id2 = "04", name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB03"" t1
USING (SELECT 1 as ID1, '01' as ID2, '001' as NAME FROM dual
UNION ALL
SELECT 2, '02', '002' FROM dual
UNION ALL
SELECT 3, '03', '003' FROM dual
UNION ALL
SELECT 4, '04', '004' FROM dual ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
WHEN NOT MATCHED THEN
insert (""ID1"", ""ID2"", ""NAME"")
values (t2.ID1, t2.ID2, t2.NAME)", sql);
iou.ExecuteAffrows();
var lst = fsql.Select<tbioudb03>().Where(a => a.id1 == 1 && a.id2 == "01" || a.id1 == 2 && a.id2 == "02" || a.id1 == 3 && a.id2 == "03" || a.id1 == 4 && a.id2 == "04").ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id1).Count());
}
class tbioudb03
{
[Column(IsPrimary = true)]
public int id1 { get; set; }
[Column(IsPrimary = true)]
public string id2 { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndVersionAndCanUpdate()
{
fsql.Delete<tbioudb04>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB04"" t1
USING (SELECT 1 as ID, '01' as NAME, 0 as VERSION, systimestamp as CREATETIME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"", ""VERSION"", ""CREATETIME"")
values (t2.ID, t2.NAME, t2.VERSION, t2.CREATETIME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB04"" t1
USING (SELECT 1 as ID, '011' as NAME, 0 as VERSION, systimestamp as CREATETIME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"", ""VERSION"", ""CREATETIME"")
values (t2.ID, t2.NAME, t2.VERSION, t2.CREATETIME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB04"" t1
USING (SELECT 2 as ID, '02' as NAME, 0 as VERSION, systimestamp as CREATETIME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"", ""VERSION"", ""CREATETIME"")
values (t2.ID, t2.NAME, t2.VERSION, t2.CREATETIME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "01" }, new tbioudb04 { id = 2, name = "02" }, new tbioudb04 { id = 3, name = "03" }, new tbioudb04 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB04"" t1
USING (SELECT 1 as ID, '01' as NAME, 0 as VERSION, systimestamp as CREATETIME FROM dual
UNION ALL
SELECT 2, '02', 0, systimestamp FROM dual
UNION ALL
SELECT 3, '03', 0, systimestamp FROM dual
UNION ALL
SELECT 4, '04', 0, systimestamp FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"", ""VERSION"", ""CREATETIME"")
values (t2.ID, t2.NAME, t2.VERSION, t2.CREATETIME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "001" }, new tbioudb04 { id = 2, name = "002" }, new tbioudb04 { id = 3, name = "003" }, new tbioudb04 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOUDB04"" t1
USING (SELECT 1 as ID, '001' as NAME, 0 as VERSION, systimestamp as CREATETIME FROM dual
UNION ALL
SELECT 2, '002', 0, systimestamp FROM dual
UNION ALL
SELECT 3, '003', 0, systimestamp FROM dual
UNION ALL
SELECT 4, '004', 0, systimestamp FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"", ""VERSION"", ""CREATETIME"")
values (t2.ID, t2.NAME, t2.VERSION, t2.CREATETIME)", sql);
iou.ExecuteAffrows();
var lst = fsql.Select<tbioudb04>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb04
{
public int id { get; set; }
public string name { get; set; }
[Column(IsVersion = true)]
public int version { get; set; }
[Column(CanUpdate = false, ServerTime = DateTimeKind.Local)]
public DateTime CreateTime { get; set; }
}
}
}

View File

@ -314,10 +314,10 @@ WHEN NOT MATCHED THEN
values (t2.ID1, t2.ID2, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou03>().SetSource(new tbiou03 { id1 = 1, id2 = "02", name = "011" });
iou = fsql.InsertOrUpdate<tbiou03>().SetSource(new tbiou03 { id1 = 1, id2 = "01", name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOU03"" t1
USING (SELECT 1 as ID1, '02' as ID2, '011' as NAME FROM dual ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
USING (SELECT 1 as ID1, '01' as ID2, '011' as NAME FROM dual ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN

View File

@ -0,0 +1,266 @@
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.Odbc.PostgreSQL
{
public class PostgreSQLInsertOrUpdateIfExistsDoNotingTest
{
IFreeSql fsql => g.pgsql;
[Fact]
public void InsertOrUpdate_OnlyPrimary()
{
fsql.Delete<tbioudb01>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new tbioudb01 { id = 1 });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb01""(""id"") VALUES(1)
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new tbioudb01 { id = 1 });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb01""(""id"") VALUES(1)
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new tbioudb01 { id = 2 });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb01""(""id"") VALUES(2)
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new[] { new tbioudb01 { id = 1 }, new tbioudb01 { id = 2 }, new tbioudb01 { id = 3 }, new tbioudb01 { id = 4 } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb01""(""id"") VALUES(1), (2), (3), (4)
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new[] { new tbioudb01 { id = 1 }, new tbioudb01 { id = 2 }, new tbioudb01 { id = 3 }, new tbioudb01 { id = 4 } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb01""(""id"") VALUES(1), (2), (3), (4)
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
}
class tbioudb01
{
public int id { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimary()
{
fsql.Delete<tbioudb02>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb02""(""id"", ""name"") VALUES(1, '01')
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb02""(""id"", ""name"") VALUES(1, '011')
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb02""(""id"", ""name"") VALUES(2, '02')
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "01" }, new tbioudb02 { id = 2, name = "02" }, new tbioudb02 { id = 3, name = "03" }, new tbioudb02 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb02""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "001" }, new tbioudb02 { id = 2, name = "002" }, new tbioudb02 { id = 3, name = "003" }, new tbioudb02 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb02""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb02>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb02
{
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbioudb022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") VALUES(1, '01')
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") VALUES(1, '011')
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") VALUES(2, '02')
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "01" }, new tbioudb022 { id = 2, name = "02" }, new tbioudb022 { id = 3, name = "03" }, new tbioudb022 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "001" }, new tbioudb022 { id = 2, name = "002" }, new tbioudb022 { id = 3, name = "003" }, new tbioudb022 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb022""(""name"") VALUES('01')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb022""(""name"") VALUES('011')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb022""(""name"") VALUES('02')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { name = "01" }, new tbioudb022 { name = "02" }, new tbioudb022 { name = "03" }, new tbioudb022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb022""(""name"") VALUES('01'), ('02'), ('03'), ('04')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { name = "001" }, new tbioudb022 { name = "002" }, new tbioudb022 { name = "003" }, new tbioudb022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb022""(""name"") VALUES('001'), ('002'), ('003'), ('004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
//--no primary and yes
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "100001" }, new tbioudb022 { name = "00001" }, new tbioudb022 { id = 2, name = "100002" }, new tbioudb022 { name = "00002" }, new tbioudb022 { id = 3, name = "100003" }, new tbioudb022 { name = "00003" }, new tbioudb022 { id = 4, name = "100004" }, new tbioudb022 { name = "00004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004')
ON CONFLICT(""id"") DO NOTHING
;
INSERT INTO ""tbioudb022""(""name"") VALUES('00001'), ('00002'), ('00003'), ('00004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
lst = fsql.Select<tbioudb022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()
{
fsql.Delete<tbioudb03>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '01')
ON CONFLICT(""id1"", ""id2"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '011')
ON CONFLICT(""id1"", ""id2"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 2, id2 = "02", name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb03""(""id1"", ""id2"", ""name"") VALUES(2, '02', '02')
ON CONFLICT(""id1"", ""id2"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "01" }, new tbioudb03 { id1 = 2, id2 = "02", name = "02" }, new tbioudb03 { id1 = 3, id2 = "03", name = "03" }, new tbioudb03 { id1 = 4, id2 = "04", name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '01'), (2, '02', '02'), (3, '03', '03'), (4, '04', '04')
ON CONFLICT(""id1"", ""id2"") DO NOTHING", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "001" }, new tbioudb03 { id1 = 2, id2 = "02", name = "002" }, new tbioudb03 { id1 = 3, id2 = "03", name = "003" }, new tbioudb03 { id1 = 4, id2 = "04", name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '001'), (2, '02', '002'), (3, '03', '003'), (4, '04', '004')
ON CONFLICT(""id1"", ""id2"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb03>().Where(a => a.id1 == 1 && a.id2 == "01" || a.id1 == 2 && a.id2 == "02" || a.id1 == 3 && a.id2 == "03" || a.id1 == 4 && a.id2 == "04").ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id1).Count());
}
class tbioudb03
{
[Column(IsPrimary = true)]
public int id1 { get; set; }
[Column(IsPrimary = true)]
public string id2 { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndVersionAndCanUpdate()
{
fsql.Delete<tbioudb04>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb04""(""id"", ""name"", ""version"", ""createtime"") VALUES(1, '01', 0, current_timestamp)
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb04""(""id"", ""name"", ""version"", ""createtime"") VALUES(1, '011', 0, current_timestamp)
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb04""(""id"", ""name"", ""version"", ""createtime"") VALUES(2, '02', 0, current_timestamp)
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "01" }, new tbioudb04 { id = 2, name = "02" }, new tbioudb04 { id = 3, name = "03" }, new tbioudb04 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb04""(""id"", ""name"", ""version"", ""createtime"") VALUES(1, '01', 0, current_timestamp), (2, '02', 0, current_timestamp), (3, '03', 0, current_timestamp), (4, '04', 0, current_timestamp)
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "001" }, new tbioudb04 { id = 2, name = "002" }, new tbioudb04 { id = 3, name = "003" }, new tbioudb04 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbioudb04""(""id"", ""name"", ""version"", ""createtime"") VALUES(1, '001', 0, current_timestamp), (2, '002', 0, current_timestamp), (3, '003', 0, current_timestamp), (4, '004', 0, current_timestamp)
ON CONFLICT(""id"") DO NOTHING", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb04>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb04
{
public int id { get; set; }
public string name { get; set; }
[Column(IsVersion = true)]
public int version { get; set; }
[Column(CanUpdate = false, ServerTime = DateTimeKind.Local)]
public DateTime CreateTime { get; set; }
}
}
}

View File

@ -194,9 +194,9 @@ ON CONFLICT(""id1"", ""id2"") DO UPDATE SET
""name"" = EXCLUDED.""name""", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou03>().SetSource(new tbiou03 { id1 = 1, id2 = "02", name = "011" });
iou = fsql.InsertOrUpdate<tbiou03>().SetSource(new tbiou03 { id1 = 1, id2 = "01", name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '02', '011')
Assert.Equal(@"INSERT INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '011')
ON CONFLICT(""id1"", ""id2"") DO UPDATE SET
""name"" = EXCLUDED.""name""", sql);
Assert.Equal(1, iou.ExecuteAffrows());

View File

@ -0,0 +1,422 @@
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.Odbc.SqlServer
{
public class SqlServerInsertOrUpdateIfExistsDoNothingTest
{
IFreeSql fsql => g.sqlserver;
[Fact]
public void InsertOrUpdate_OnlyPrimary()
{
fsql.Delete<tbioudb01>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new tbioudb01 { id = 1 });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb01] t1
USING (SELECT 1 as id ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id])
values (t2.id);", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new tbioudb01 { id = 1 });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb01] t1
USING (SELECT 1 as id ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id])
values (t2.id);", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new tbioudb01 { id = 2 });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb01] t1
USING (SELECT 2 as id ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id])
values (t2.id);", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new[] { new tbioudb01 { id = 1 }, new tbioudb01 { id = 2 }, new tbioudb01 { id = 3 }, new tbioudb01 { id = 4 } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb01] t1
USING (SELECT 1 as id
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4 ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id])
values (t2.id);", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new[] { new tbioudb01 { id = 1 }, new tbioudb01 { id = 2 }, new tbioudb01 { id = 3 }, new tbioudb01 { id = 4 } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb01] t1
USING (SELECT 1 as id
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4 ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id])
values (t2.id);", sql);
Assert.Equal(0, iou.ExecuteAffrows());
}
class tbioudb01
{
public int id { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimary()
{
fsql.Delete<tbioudb02>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb02] t1
USING (SELECT 1 as id, N'01' as name ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb02] t1
USING (SELECT 1 as id, N'011' as name ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb02] t1
USING (SELECT 2 as id, N'02' as name ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "01" }, new tbioudb02 { id = 2, name = "02" }, new tbioudb02 { id = 3, name = "03" }, new tbioudb02 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb02] t1
USING (SELECT 1 as id, N'01' as name
UNION ALL
SELECT 2, N'02'
UNION ALL
SELECT 3, N'03'
UNION ALL
SELECT 4, N'04' ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "001" }, new tbioudb02 { id = 2, name = "002" }, new tbioudb02 { id = 3, name = "003" }, new tbioudb02 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb02] t1
USING (SELECT 1 as id, N'001' as name
UNION ALL
SELECT 2, N'002'
UNION ALL
SELECT 3, N'003'
UNION ALL
SELECT 4, N'004' ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb02>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb02
{
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbioudb022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"SET IDENTITY_INSERT [tbioudb022] ON;
MERGE INTO [tbioudb022] t1
USING (SELECT 1 as id, N'01' as name ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbioudb022] OFF;", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"SET IDENTITY_INSERT [tbioudb022] ON;
MERGE INTO [tbioudb022] t1
USING (SELECT 1 as id, N'011' as name ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbioudb022] OFF;", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"SET IDENTITY_INSERT [tbioudb022] ON;
MERGE INTO [tbioudb022] t1
USING (SELECT 2 as id, N'02' as name ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbioudb022] OFF;", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "01" }, new tbioudb022 { id = 2, name = "02" }, new tbioudb022 { id = 3, name = "03" }, new tbioudb022 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"SET IDENTITY_INSERT [tbioudb022] ON;
MERGE INTO [tbioudb022] t1
USING (SELECT 1 as id, N'01' as name
UNION ALL
SELECT 2, N'02'
UNION ALL
SELECT 3, N'03'
UNION ALL
SELECT 4, N'04' ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbioudb022] OFF;", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "001" }, new tbioudb022 { id = 2, name = "002" }, new tbioudb022 { id = 3, name = "003" }, new tbioudb022 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"SET IDENTITY_INSERT [tbioudb022] ON;
MERGE INTO [tbioudb022] t1
USING (SELECT 1 as id, N'001' as name
UNION ALL
SELECT 2, N'002'
UNION ALL
SELECT 3, N'003'
UNION ALL
SELECT 4, N'004' ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbioudb022] OFF;", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO [tbioudb022]([name]) VALUES(N'01')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO [tbioudb022]([name]) VALUES(N'011')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO [tbioudb022]([name]) VALUES(N'02')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { name = "01" }, new tbioudb022 { name = "02" }, new tbioudb022 { name = "03" }, new tbioudb022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO [tbioudb022]([name]) VALUES(N'01'), (N'02'), (N'03'), (N'04')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { name = "001" }, new tbioudb022 { name = "002" }, new tbioudb022 { name = "003" }, new tbioudb022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO [tbioudb022]([name]) VALUES(N'001'), (N'002'), (N'003'), (N'004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
//--no primary and yes
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "100001" }, new tbioudb022 { name = "00001" }, new tbioudb022 { id = 2, name = "100002" }, new tbioudb022 { name = "00002" }, new tbioudb022 { id = 3, name = "100003" }, new tbioudb022 { name = "00003" }, new tbioudb022 { id = 4, name = "100004" }, new tbioudb022 { name = "00004" } });
sql = iou.ToSql();
Assert.Equal(@"SET IDENTITY_INSERT [tbioudb022] ON;
MERGE INTO [tbioudb022] t1
USING (SELECT 1 as id, N'100001' as name
UNION ALL
SELECT 2, N'100002'
UNION ALL
SELECT 3, N'100003'
UNION ALL
SELECT 4, N'100004' ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbioudb022] OFF;
;
INSERT INTO [tbioudb022]([name]) VALUES(N'00001'), (N'00002'), (N'00003'), (N'00004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
lst = fsql.Select<tbioudb022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()
{
fsql.Delete<tbioudb03>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb03] t1
USING (SELECT 1 as id1, N'01' as id2, N'01' as name ) t2 ON (t1.[id1] = t2.id1 AND t1.[id2] = t2.id2)
WHEN NOT MATCHED THEN
insert ([id1], [id2], [name])
values (t2.id1, t2.id2, t2.name);", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb03] t1
USING (SELECT 1 as id1, N'01' as id2, N'011' as name ) t2 ON (t1.[id1] = t2.id1 AND t1.[id2] = t2.id2)
WHEN NOT MATCHED THEN
insert ([id1], [id2], [name])
values (t2.id1, t2.id2, t2.name);", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 2, id2 = "02", name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb03] t1
USING (SELECT 2 as id1, N'02' as id2, N'02' as name ) t2 ON (t1.[id1] = t2.id1 AND t1.[id2] = t2.id2)
WHEN NOT MATCHED THEN
insert ([id1], [id2], [name])
values (t2.id1, t2.id2, t2.name);", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "01" }, new tbioudb03 { id1 = 2, id2 = "02", name = "02" }, new tbioudb03 { id1 = 3, id2 = "03", name = "03" }, new tbioudb03 { id1 = 4, id2 = "04", name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb03] t1
USING (SELECT 1 as id1, N'01' as id2, N'01' as name
UNION ALL
SELECT 2, N'02', N'02'
UNION ALL
SELECT 3, N'03', N'03'
UNION ALL
SELECT 4, N'04', N'04' ) t2 ON (t1.[id1] = t2.id1 AND t1.[id2] = t2.id2)
WHEN NOT MATCHED THEN
insert ([id1], [id2], [name])
values (t2.id1, t2.id2, t2.name);", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "001" }, new tbioudb03 { id1 = 2, id2 = "02", name = "002" }, new tbioudb03 { id1 = 3, id2 = "03", name = "003" }, new tbioudb03 { id1 = 4, id2 = "04", name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb03] t1
USING (SELECT 1 as id1, N'01' as id2, N'001' as name
UNION ALL
SELECT 2, N'02', N'002'
UNION ALL
SELECT 3, N'03', N'003'
UNION ALL
SELECT 4, N'04', N'004' ) t2 ON (t1.[id1] = t2.id1 AND t1.[id2] = t2.id2)
WHEN NOT MATCHED THEN
insert ([id1], [id2], [name])
values (t2.id1, t2.id2, t2.name);", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb03>().Where(a => a.id1 == 1 && a.id2 == "01" || a.id1 == 2 && a.id2 == "02" || a.id1 == 3 && a.id2 == "03" || a.id1 == 4 && a.id2 == "04").ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id1).Count());
}
class tbioudb03
{
[Column(IsPrimary = true)]
public int id1 { get; set; }
[Column(IsPrimary = true)]
public string id2 { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndVersionAndCanUpdate()
{
fsql.Delete<tbioudb04>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb04] t1
USING (SELECT 1 as id, N'01' as name, 0 as version, getdate() as CreateTime ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name], [version], [CreateTime])
values (t2.id, t2.name, t2.version, t2.CreateTime);", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb04] t1
USING (SELECT 1 as id, N'011' as name, 0 as version, getdate() as CreateTime ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name], [version], [CreateTime])
values (t2.id, t2.name, t2.version, t2.CreateTime);", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb04] t1
USING (SELECT 2 as id, N'02' as name, 0 as version, getdate() as CreateTime ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name], [version], [CreateTime])
values (t2.id, t2.name, t2.version, t2.CreateTime);", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "01" }, new tbioudb04 { id = 2, name = "02" }, new tbioudb04 { id = 3, name = "03" }, new tbioudb04 { id = 4, name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb04] t1
USING (SELECT 1 as id, N'01' as name, 0 as version, getdate() as CreateTime
UNION ALL
SELECT 2, N'02', 0, getdate()
UNION ALL
SELECT 3, N'03', 0, getdate()
UNION ALL
SELECT 4, N'04', 0, getdate() ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name], [version], [CreateTime])
values (t2.id, t2.name, t2.version, t2.CreateTime);", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "001" }, new tbioudb04 { id = 2, name = "002" }, new tbioudb04 { id = 3, name = "003" }, new tbioudb04 { id = 4, name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbioudb04] t1
USING (SELECT 1 as id, N'001' as name, 0 as version, getdate() as CreateTime
UNION ALL
SELECT 2, N'002', 0, getdate()
UNION ALL
SELECT 3, N'003', 0, getdate()
UNION ALL
SELECT 4, N'004', 0, getdate() ) t2 ON (t1.[id] = t2.id)
WHEN NOT MATCHED THEN
insert ([id], [name], [version], [CreateTime])
values (t2.id, t2.name, t2.version, t2.CreateTime);", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb04>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb04
{
public int id { get; set; }
public string name { get; set; }
[Column(IsVersion = true)]
public int version { get; set; }
[Column(CanUpdate = false, ServerTime = DateTimeKind.Local)]
public DateTime CreateTime { get; set; }
}
}
}

View File

@ -311,10 +311,10 @@ WHEN NOT MATCHED THEN
values (t2.id1, t2.id2, t2.name);", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou03>().SetSource(new tbiou03 { id1 = 1, id2 = "02", name = "011" });
iou = fsql.InsertOrUpdate<tbiou03>().SetSource(new tbiou03 { id1 = 1, id2 = "01", name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO [tbiou03] t1
USING (SELECT 1 as id1, N'02' as id2, N'011' as name ) t2 ON (t1.[id1] = t2.id1 AND t1.[id2] = t2.id2)
USING (SELECT 1 as id1, N'01' as id2, N'011' as name ) t2 ON (t1.[id1] = t2.id1 AND t1.[id2] = t2.id2)
WHEN MATCHED THEN
update set [name] = t2.name
WHEN NOT MATCHED THEN