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

Commit c4d584f

Browse files
committed
Add InsertAndGetLastInsertId and DRY-up GetLastInsertId provider impls
1 parent 93b52b3 commit c4d584f

File tree

7 files changed

+45
-45
lines changed

7 files changed

+45
-45
lines changed

src/ServiceStack.OrmLite.MySql/MySqlDialectProvider.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ private MySqlDialectProvider()
2525
base.DefaultStringLength = 255;
2626
base.InitColumnTypeMap();
2727
base.DefaultValueFormat = " DEFAULT '{0}'";
28+
base.SelectIdentitySql = "SELECT LAST_INSERT_ID()";
2829
}
2930

3031
public override string GetQuotedParam(string paramValue)
@@ -104,14 +105,6 @@ public override string GetQuotedName(string name)
104105
{
105106
return string.Format("`{0}`", name);
106107
}
107-
108-
public override long GetLastInsertId(IDbCommand command)
109-
{
110-
command.CommandText = "SELECT LAST_INSERT_ID()";
111-
var result = command.ExecuteScalar();
112-
if (result is DBNull) return default(long);
113-
return Convert.ToInt64(result);
114-
}
115108

116109
public override SqlExpressionVisitor<T> ExpressionVisitor<T> ()
117110
{

src/ServiceStack.OrmLite.PostgreSQL/PostgreSQLDialectProvider.cs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ private PostgreSQLDialectProvider()
2828
base.StringLengthUnicodeColumnDefinitionFormat = "character varying({0})";
2929
base.StringLengthNonUnicodeColumnDefinitionFormat = "character varying({0})";
3030
base.InitColumnTypeMap();
31+
base.SelectIdentitySql = "SELECT LASTVAL()";
3132
this.NamingStrategy = new PostgreSqlNamingStrategy();
3233

3334
DbTypeMap.Set<TimeSpan>(DbType.Time, "Interval");
@@ -145,19 +146,10 @@ public override object ConvertDbValue(object value, Type type)
145146
{
146147
if (value == null || value is DBNull) return null;
147148

148-
if(type == typeof(byte[])) { return value; }
149+
if (type == typeof(byte[])) { return value; }
149150

150151
return base.ConvertDbValue(value, type);
151152
}
152-
153-
public override long GetLastInsertId(IDbCommand command)
154-
{
155-
command.CommandText = "SELECT LASTVAL()";
156-
var result = command.ExecuteScalar();
157-
if (result is DBNull)
158-
return default(long);
159-
return Convert.ToInt64(result);
160-
}
161153

162154
public override SqlExpressionVisitor<T> ExpressionVisitor<T>()
163155
{

src/ServiceStack.OrmLite.SqlServer/SqlServerOrmLiteDialectProvider.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public SqlServerOrmLiteDialectProvider()
2525
base.DecimalColumnDefinition = "DECIMAL(38,6)";
2626
base.TimeColumnDefinition = "TIME"; //SQLSERVER 2008+
2727
base.BlobColumnDefinition = "VARBINARY(MAX)";
28+
base.SelectIdentitySql = "SELECT SCOPE_IDENTITY()";
2829

2930
base.InitColumnTypeMap();
3031
}
@@ -171,12 +172,6 @@ public void EnsureUtc(bool shouldEnsureUtc)
171172
_ensureUtc = shouldEnsureUtc;
172173
}
173174

174-
public override long GetLastInsertId(IDbCommand dbCmd)
175-
{
176-
dbCmd.CommandText = "SELECT SCOPE_IDENTITY()";
177-
return dbCmd.GetLongScalar();
178-
}
179-
180175
public override SqlExpressionVisitor<T> ExpressionVisitor<T>()
181176
{
182177
return new SqlServerExpressionVisitor<T>();

src/ServiceStack.OrmLite.Sqlite/SqliteOrmLiteDialectProviderBase.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ protected SqliteOrmLiteDialectProviderBase()
1515
base.DateTimeColumnDefinition = base.StringColumnDefinition;
1616
base.BoolColumnDefinition = base.IntColumnDefinition;
1717
base.GuidColumnDefinition = "CHAR(32)";
18+
base.SelectIdentitySql = "SELECT last_insert_rowid()";
1819

1920
base.InitColumnTypeMap();
2021
}
@@ -149,13 +150,6 @@ public override string GetQuotedValue(object value, Type fieldType)
149150
return base.GetQuotedValue(value, fieldType);
150151
}
151152

152-
public override long GetLastInsertId(IDbCommand dbCmd)
153-
{
154-
dbCmd.CommandText = "SELECT last_insert_rowid()";
155-
var result = dbCmd.ExecuteScalar();
156-
return (long)result;
157-
}
158-
159153
public override SqlExpressionVisitor<T> ExpressionVisitor<T>()
160154
{
161155
return new SqliteExpressionVisitor<T>();

src/ServiceStack.OrmLite/IOrmLiteDialectProvider.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ string GetColumnDefinition(
5555

5656
long GetLastInsertId(IDbCommand command);
5757

58+
long InsertAndGetLastInsertId<T>(IDbCommand dbCmd);
59+
5860
string ToSelectStatement(Type tableType, string sqlFilter, params object[] filterParams);
5961

6062
string ToInsertRowStatement(IDbCommand command, object objWithProperties, ICollection<string> InsertFields = null);

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -408,10 +408,28 @@ public virtual string GetColumnDefinition(string fieldName, Type fieldType,
408408
}
409409

410410
return sql.ToString();
411-
}
412-
413-
public abstract long GetLastInsertId(IDbCommand command);
414-
411+
}
412+
413+
public virtual string SelectIdentitySql { get; set; }
414+
415+
public virtual long GetLastInsertId(IDbCommand dbCmd)
416+
{
417+
if (SelectIdentitySql == null)
418+
throw new NotImplementedException("Returning last inserted identity is not implemented on this DB Provider.");
419+
420+
dbCmd.CommandText = SelectIdentitySql;
421+
return dbCmd.GetLongScalar();
422+
}
423+
424+
public virtual long InsertAndGetLastInsertId<T>(IDbCommand dbCmd)
425+
{
426+
if (SelectIdentitySql == null)
427+
throw new NotImplementedException("Returning last inserted identity is not implemented on this DB Provider.");
428+
429+
dbCmd.CommandText += "; " + SelectIdentitySql;
430+
return dbCmd.GetLongScalar();
431+
}
432+
415433
public virtual string ToCountStatement(Type fromTableType, string sqlFilter, params object[] filterParams)
416434
{
417435
var sql = new StringBuilder();
@@ -502,8 +520,8 @@ public virtual string ToInsertRowStatement(IDbCommand command, object objWithPro
502520
GetQuotedTableName(modelDef), sbColumnNames, sbColumnValues);
503521

504522
return sql;
505-
}
506-
523+
}
524+
507525
public virtual IDbCommand CreateParameterizedInsertStatement(IDbConnection connection, object objWithProperties, ICollection<string> insertFields = null)
508526
{
509527
if (insertFields == null)
@@ -513,8 +531,8 @@ public virtual IDbCommand CreateParameterizedInsertStatement(IDbConnection conne
513531
var sbColumnValues = new StringBuilder();
514532
var modelDef = objWithProperties.GetType().GetModelDefinition();
515533

516-
var command = connection.CreateCommand();
517-
command.CommandTimeout = OrmLiteConfig.CommandTimeout;
534+
var cmd = connection.CreateCommand();
535+
cmd.CommandTimeout = OrmLiteConfig.CommandTimeout;
518536

519537
foreach (var fieldDef in modelDef.FieldDefinitions)
520538
{
@@ -533,7 +551,7 @@ public virtual IDbCommand CreateParameterizedInsertStatement(IDbConnection conne
533551
sbColumnValues.Append(ParamString)
534552
.Append(fieldDef.FieldName);
535553

536-
AddParameterForFieldToCommand(command, fieldDef, objWithProperties);
554+
AddParameterForFieldToCommand(cmd, fieldDef, objWithProperties);
537555
}
538556
catch (Exception ex)
539557
{
@@ -542,9 +560,10 @@ public virtual IDbCommand CreateParameterizedInsertStatement(IDbConnection conne
542560
}
543561
}
544562

545-
command.CommandText = string.Format("INSERT INTO {0} ({1}) VALUES ({2})",
546-
GetQuotedTableName(modelDef), sbColumnNames, sbColumnValues);
547-
return command;
563+
cmd.CommandText = string.Format("INSERT INTO {0} ({1}) VALUES ({2})",
564+
GetQuotedTableName(modelDef), sbColumnNames, sbColumnValues);
565+
566+
return cmd;
548567
}
549568

550569
public void ReParameterizeInsertStatement(IDbCommand command, object objWithProperties, ICollection<string> insertFields = null)

src/ServiceStack.OrmLite/OrmLiteWriteConnectionExtensions.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,16 +197,21 @@ public static void InsertAll<T>(this IDbConnection dbConn, IEnumerable<T> objs)
197197
/// <summary>
198198
/// Performs an Insert() except arguments are passed as parameters to the generated SQL
199199
/// </summary>
200-
public static void InsertParam<T>(this IDbConnection dbConn, T obj)
200+
public static long InsertParam<T>(this IDbConnection dbConn, T obj, bool selectIdentity = false)
201201
where T : new()
202202
{
203-
dbConn.Exec(dbCmd =>
203+
return dbConn.Exec(dbCmd =>
204204
{
205205
using (var insertStmt = dbConn.CreateInsertStatement(obj))
206206
{
207207
dbCmd.CopyParameterizedStatementTo(insertStmt);
208208
}
209+
210+
if (selectIdentity)
211+
return OrmLiteConfig.DialectProvider.InsertAndGetLastInsertId<T>(dbCmd);
212+
209213
dbCmd.ExecuteNonQuery();
214+
return -1;
210215
});
211216
}
212217

0 commit comments

Comments
 (0)