Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 7584468

Browse files
committed
Merge branch 'master' of github.com:ServiceStack/ServiceStack.OrmLite
2 parents 8d6df25 + 774160a commit 7584468

File tree

3 files changed

+170
-0
lines changed

3 files changed

+170
-0
lines changed

src/ServiceStack.OrmLite/OrmLiteReadApi.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,15 @@ public static int ExecuteNonQuery(this IDbConnection dbConn, string sql, Diction
554554
return dbConn.Exec(dbCmd => dbCmd.ExecNonQuery(sql, dict));
555555
}
556556

557+
/// <summary>
558+
/// Executes a raw sql non-query using a parameterized query with a dbCmd filter. E.g:
559+
/// </summary>
560+
/// <returns>number of rows affected</returns>
561+
public static int ExecuteNonQuery(this IDbConnection dbConn, string sql, Action<IDbCommand> dbCmdFilter)
562+
{
563+
return dbConn.Exec(dbCmd => dbCmd.ExecNonQuery(sql, dbCmdFilter));
564+
}
565+
557566
/// <summary>
558567
/// Returns results from a Stored Procedure, using a parameterized query.
559568
/// </summary>

src/ServiceStack.OrmLite/OrmLiteResultsFilterExtensions.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,21 @@ public static int ExecNonQuery(this IDbCommand dbCmd)
6262
return dbCmd.ExecuteNonQuery();
6363
}
6464

65+
public static int ExecNonQuery(this IDbCommand dbCmd, string sql, Action<IDbCommand> dbCmdFilter)
66+
{
67+
if (dbCmdFilter != null) dbCmdFilter(dbCmd);
68+
69+
dbCmd.CommandText = sql;
70+
71+
if (Log.IsDebugEnabled)
72+
Log.DebugCommand(dbCmd);
73+
74+
if (OrmLiteConfig.ResultsFilter != null)
75+
return OrmLiteConfig.ResultsFilter.ExecuteSql(dbCmd);
76+
77+
return dbCmd.ExecuteNonQuery();
78+
}
79+
6580
public static List<T> ConvertToList<T>(this IDbCommand dbCmd, string sql = null)
6681
{
6782
if (sql != null)

tests/ServiceStack.OrmLite.Tests/OrmLiteExecuteNonQueryTests.cs

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,152 @@
1111
[TestFixture]
1212
public class OrmLiteExecuteNonQueryTests
1313
{
14+
public class WithDbCmdFilter : OrmLiteTestBase
15+
{
16+
[Test]
17+
public void Can_insert_one_row_and_get_one_affected_row()
18+
{
19+
using (var db = OpenDbConnection())
20+
{
21+
db.DropAndCreateTable<Person>();
22+
23+
var name = "Jane Doe";
24+
25+
var affectedRows = db.ExecuteNonQuery(Dialect != Dialect.Firebird
26+
? "insert into Person (Name) Values (@name);"
27+
: "insert into Person (Id, Name) Values (1, @name);", cmd =>
28+
{
29+
cmd.AddParam("name", name);
30+
});
31+
32+
var personId = db.Single<Person>(q => q.Name == name).Id;
33+
34+
var insertedRow = db.SingleById<Person>(personId);
35+
36+
Assert.That(affectedRows, Is.EqualTo(1));
37+
Assert.That(insertedRow.Name, Is.EqualTo(name));
38+
}
39+
}
40+
41+
[Test]
42+
public void Can_insert_multiple_rows_and_get_matching_number_of_affected_rows()
43+
{
44+
using (var db = OpenDbConnection())
45+
{
46+
db.DropAndCreateTable<Person>();
47+
48+
var name1 = "Jane Doe";
49+
var name2 = "john Smith";
50+
51+
int affectedRows = 0;
52+
if (Dialect != Dialect.Firebird)
53+
{
54+
affectedRows = db.ExecuteNonQuery(@"
55+
INSERT INTO Person (Name)
56+
SELECT @name1
57+
UNION
58+
SELECT @name2", cmd =>
59+
{
60+
cmd.AddParam("name1", name1);
61+
cmd.AddParam("name2", name2);
62+
});
63+
}
64+
else
65+
{
66+
affectedRows = db.ExecuteNonQuery(@"
67+
INSERT INTO Person (Id, Name)
68+
SELECT 1, CAST(@name1 as VARCHAR(128)) FROM RDB$DATABASE
69+
UNION
70+
SELECT 2, CAST(@name2 as VARCHAR(128)) FROM RDB$DATABASE", cmd =>
71+
{
72+
cmd.AddParam("name1", name1);
73+
cmd.AddParam("name2", name2);
74+
});
75+
}
76+
77+
var rows = db.SqlColumn<Person>("select * from Person order by name");
78+
79+
Assert.That(affectedRows, Is.EqualTo(2));
80+
Assert.That(rows[0].Name, Is.EqualTo(name1));
81+
Assert.That(rows[1].Name, Is.EqualTo(name2));
82+
83+
var ids = db.SqlColumn<int>("select Id from Person order by Id");
84+
Assert.That(ids, Is.EquivalentTo(new[] { 1, 2 }));
85+
}
86+
}
87+
88+
[Test]
89+
public void Can_update_and_returns_appropriate_number_of_affected_rows()
90+
{
91+
using (var db = OpenDbConnection())
92+
{
93+
db.DropAndCreateTable<Person>();
94+
95+
var person = new Person
96+
{
97+
Name = "Jane Doe"
98+
};
99+
100+
var personId = db.Insert(person, selectIdentity: true);
101+
102+
var newName = "John Smith";
103+
104+
var affectedRows = db.ExecuteNonQuery("Update Person Set Name = @newName where Id = @personId", cmd =>
105+
{
106+
cmd.AddParam("personId", personId);
107+
cmd.AddParam("newName", newName);
108+
});
109+
110+
var updatedPerson = db.SingleById<Person>(personId);
111+
112+
Assert.That(affectedRows, Is.EqualTo(1));
113+
Assert.That(updatedPerson.Name, Is.EqualTo(newName));
114+
}
115+
}
116+
117+
[Test]
118+
public void Can_delete_and_returns_appropriate_number_of_affected_rows()
119+
{
120+
using (var db = OpenDbConnection())
121+
{
122+
db.DropAndCreateTable<Person>();
123+
124+
var person = new Person
125+
{
126+
Name = "Jane Doe"
127+
};
128+
129+
var personId = db.Insert(person, selectIdentity: true);
130+
131+
var affectedRows = db.ExecuteNonQuery("Delete From Person where Id = @personId", cmd =>
132+
{
133+
cmd.AddParam("personId", personId);
134+
});
135+
136+
var count = db.Count<Person>();
137+
138+
Assert.That(affectedRows, Is.EqualTo(1));
139+
Assert.That(count, Is.EqualTo(0));
140+
}
141+
}
142+
143+
[Test]
144+
public void Can_exec_statement_which_performs_no_changes_and_returns_no_affected_rows()
145+
{
146+
using (var db = OpenDbConnection())
147+
{
148+
db.DropAndCreateTable<Person>();
149+
150+
var affectedRows = db.ExecuteNonQuery(@"Delete From Person Where Id = @nonExistingId", cmd =>
151+
{
152+
cmd.AddParam("nonExistingId", -1);
153+
});
154+
155+
Assert.That(affectedRows, Is.EqualTo(0));
156+
}
157+
}
158+
}
159+
14160
public class UsingAnonType : OrmLiteTestBase
15161
{
16162
[Test]

0 commit comments

Comments
 (0)