Skip to content

Commit 58bc309

Browse files
committed
SQL Server doesn't try to write to TIMESTAMP columns
1 parent ec06753 commit 58bc309

8 files changed

Lines changed: 60 additions & 28 deletions

File tree

Simple.Data.Ado/UpdateHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ private string CreateWhereExistsStatement(SimpleExpression criteria, Table table
9393
private string GetUpdateClause(Table table, IEnumerable<KeyValuePair<string, object>> data)
9494
{
9595
var setClause = string.Join(", ",
96-
data.Where(kvp => table.HasColumn(kvp.Key))
96+
data.Where(kvp => table.HasColumn(kvp.Key) && table.FindColumn(kvp.Key).IsWriteable)
9797
.Select(kvp => CreateColumnUpdateClause(kvp.Key, kvp.Value, table)));
9898
return string.Format("update {0} set {1}", table.QualifiedName, setClause);
9999
}

Simple.Data.BehaviourTest/UpdateTest.cs

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -89,35 +89,37 @@ public void TestUpdateWithDynamicObjectAndOriginalValues()
8989
{
9090
dynamic newRecord = new SimpleRecord();
9191
newRecord.Id = 1;
92-
newRecord.Name = "Steve";
92+
newRecord.Name = "Steve-o";
9393
newRecord.Age = 50;
9494
dynamic originalRecord = new SimpleRecord();
95-
originalRecord.Id = 2;
95+
originalRecord.Id = 1;
9696
originalRecord.Name = "Steve";
9797
originalRecord.Age = 50;
9898

9999
_db.Users.Update(newRecord, originalRecord);
100-
GeneratedSqlIs("update [dbo].[Users] set [Id] = @p1 where [dbo].[Users].[Id] = @p2");
101-
Parameter(0).Is(1);
102-
Parameter(1).Is(2);
100+
GeneratedSqlIs("update [dbo].[Users] set [Name] = @p1 where ([dbo].[Users].[Id] = @p2 and [dbo].[Users].[Name] = @p3)");
101+
Parameter(0).Is("Steve-o");
102+
Parameter(1).Is(1);
103+
Parameter(2).Is("Steve");
103104
}
104105

105106
[Test]
106107
public void TestUpdateWithDynamicObjectsAndOriginalValues()
107108
{
108109
dynamic newRecord = new SimpleRecord();
109110
newRecord.Id = 1;
110-
newRecord.Name = "Steve";
111+
newRecord.Name = "Steve-o";
111112
newRecord.Age = 50;
112113
dynamic originalRecord = new SimpleRecord();
113-
originalRecord.Id = 2;
114+
originalRecord.Id = 1;
114115
originalRecord.Name = "Steve";
115116
originalRecord.Age = 50;
116117

117118
_db.Users.Update(new[] {newRecord}, new[] {originalRecord});
118-
GeneratedSqlIs("update [dbo].[Users] set [Id] = @p1 where [dbo].[Users].[Id] = @p2");
119-
Parameter(0).Is(1);
120-
Parameter(1).Is(2);
119+
GeneratedSqlIs("update [dbo].[Users] set [Name] = @p1 where ([dbo].[Users].[Id] = @p2 and [dbo].[Users].[Name] = @p3)");
120+
Parameter(0).Is("Steve-o");
121+
Parameter(1).Is(1);
122+
Parameter(2).Is("Steve");
121123
}
122124

123125
[Test]
@@ -194,15 +196,15 @@ public void TestUpdateWithStaticObjectAndOriginalObject()
194196
var newUser = new User
195197
{
196198
Id = 1,
197-
Name = "Steve",
199+
Name = "Steve-o",
198200
Age = 50
199201
};
200-
var originalUser = new User {Id = 2, Name = "Steve", Age = 50};
202+
var originalUser = new User {Id = 1, Name = "Steve", Age = 50};
201203
_db.Users.Update(newUser, originalUser);
202-
GeneratedSqlIs(
203-
"update [dbo].[Users] set [Id] = @p1 where [dbo].[Users].[Id] = @p2");
204-
Parameter(0).Is(1);
205-
Parameter(1).Is(2);
204+
GeneratedSqlIs("update [dbo].[Users] set [Name] = @p1 where ([dbo].[Users].[Id] = @p2 and [dbo].[Users].[Name] = @p3)");
205+
Parameter(0).Is("Steve-o");
206+
Parameter(1).Is(1);
207+
Parameter(2).Is("Steve");
206208
}
207209

208210
[Test]
@@ -211,15 +213,15 @@ public void TestUpdateWithStaticObjectsAndOriginalObject()
211213
var newUser = new User
212214
{
213215
Id = 1,
214-
Name = "Steve",
216+
Name = "Steve-o",
215217
Age = 50
216218
};
217-
var originalUser = new User { Id = 2, Name = "Steve", Age = 50 };
219+
var originalUser = new User { Id = 1, Name = "Steve", Age = 50 };
218220
_db.Users.Update(new[] {newUser}, new[] {originalUser});
219-
GeneratedSqlIs(
220-
"update [dbo].[Users] set [Id] = @p1 where [dbo].[Users].[Id] = @p2");
221-
Parameter(0).Is(1);
222-
Parameter(1).Is(2);
221+
GeneratedSqlIs("update [dbo].[Users] set [Name] = @p1 where ([dbo].[Users].[Id] = @p2 and [dbo].[Users].[Name] = @p3)");
222+
Parameter(0).Is("Steve-o");
223+
Parameter(1).Is(1);
224+
Parameter(2).Is("Steve");
223225
}
224226

225227
[Test]

Simple.Data.InMemoryTest/Simple.Data.InMemoryTest.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@
5858
<ItemGroup>
5959
<Compile Include="CanAssignArray.cs" />
6060
<Compile Include="InMemoryTests.cs" />
61-
<Compile Include="JoinTests.cs" />
6261
<Compile Include="Properties\AssemblyInfo.cs" />
6362
</ItemGroup>
6463
<ItemGroup>

Simple.Data.SqlServer/DbTypeLookup.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ internal static class DbTypeLookup
3737
{"varchar", SqlDbType.VarChar},
3838
{"binary", SqlDbType.Binary},
3939
{"char", SqlDbType.Char},
40-
{"timestamp", SqlDbType.Binary},
40+
{"timestamp", SqlDbType.Timestamp},
4141
{"nvarchar", SqlDbType.NVarChar},
4242
{"nchar", SqlDbType.NChar},
4343
{"xml", SqlDbType.Xml},

Simple.Data.SqlTest/UpdateTests.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,5 +118,16 @@ public void ToListShouldExecuteQuery()
118118
Assert.DoesNotThrow(() =>
119119
db.Customers.Update(customers));
120120
}
121+
122+
[Test]
123+
public void TestUpdateWithTimestamp()
124+
{
125+
var db = DatabaseHelper.Open();
126+
var row = db.TimestampTest.Insert(Description: "Inserted");
127+
row.Description = "Updated";
128+
db.TimestampTest.Update(row);
129+
row = db.TimestampTest.Get(row.Id);
130+
Assert.AreEqual("Updated", row.Description);
131+
}
121132
}
122133
}

Simple.Data/DatabaseRunner.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ public DatabaseRunner(Adapter adapter)
1010
_adapter = adapter;
1111
}
1212

13+
protected override Adapter Adapter
14+
{
15+
get { return _adapter; }
16+
}
17+
1318
internal override IDictionary<string, object> FindOne(string tableName, SimpleExpression criteria)
1419
{
1520
return _adapter.FindOne(tableName, criteria);

Simple.Data/RunStrategy.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ namespace Simple.Data
55

66
internal abstract class RunStrategy
77
{
8+
protected abstract Adapter Adapter { get; }
9+
810
/// <summary>
911
/// Finds data from the specified "table".
1012
/// </summary>
@@ -65,16 +67,24 @@ protected static Dictionary<string, object> CreateChangedValuesDict(
6567
return changedValuesDict;
6668
}
6769

68-
protected static SimpleExpression CreateCriteriaFromOriginalValues(string tableName,
70+
protected SimpleExpression CreateCriteriaFromOriginalValues(string tableName,
6971
IDictionary<string, object> newValuesDict,
7072
IDictionary<string, object>
7173
originalValuesDict)
7274
{
73-
var criteriaValues = originalValuesDict
75+
var criteriaValues = Adapter.GetKey(tableName, originalValuesDict);
76+
77+
foreach (var kvp in originalValuesDict
7478
.Where(
7579
originalKvp =>
7680
newValuesDict.ContainsKey(originalKvp.Key) &&
77-
!(Equals(newValuesDict[originalKvp.Key], originalKvp.Value)));
81+
!(Equals(newValuesDict[originalKvp.Key], originalKvp.Value))))
82+
{
83+
if (!criteriaValues.ContainsKey(kvp.Key))
84+
{
85+
criteriaValues.Add(kvp);
86+
}
87+
};
7888

7989
return ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteriaValues);
8090
}

Simple.Data/TransactionRunner.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ public TransactionRunner(IAdapterWithTransactions adapter, IAdapterTransaction a
1414
_adapterTransaction = adapterTransaction;
1515
}
1616

17+
protected override Adapter Adapter
18+
{
19+
get { return (Adapter) _adapter; }
20+
}
21+
1722
internal override IDictionary<string, object> FindOne(string tableName, SimpleExpression criteria)
1823
{
1924
return Find(tableName, criteria).FirstOrDefault();

0 commit comments

Comments
 (0)