jack drawbridge
jackandpat.d at gmail.com
Fri Aug 10 07:51:06 CDT 2012
John, I'm not a SQL server person, nor c#, but I found this that may be worth a read. http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/ Don't shoot the messenger if it isn't applicable. jack On Fri, Aug 10, 2012 at 8:38 AM, jwcolby <jwcolby at colbyconsulting.com>wrote: > I have written a function to perform an insert using a passed in SQL > string. I need it to return an integer PK autoincremented by the table: > > public int mExecNonQueryReturnIdentity(**string strCnn, string strSQL, > int timeOut) > { > int intIdentity = 0; //reset the records affected property > before we execute > SqlConnection mCnn = null; //setup a sql connection object > SqlCommand myCommand = null; //setup a sql command object > try > { > mCnn = new SqlConnection(strCnn); //create a new sql > connection using the connection string passed in > mCnn.Open(); //open the connection > myCommand = new SqlCommand(strSQL, mCnn); //create a > new command using the sql connection and sql statment > myCommand.CommandTimeout = 60; //set the command time > out > SqlParameter param = new SqlParameter("@ID", > SqlDbType.Int, 4); > param.Direction = ParameterDirection.Output; > myCommand.Parameters.Add(**param); > > myCommand.ExecuteNonQuery(); //execute the sql > statement and set the records affected property > intIdentity = (int)param.Value; > } > catch (SqlException ex) > { > logger.Error(ex.ToString()); > } > return intIdentity ; > } > > The SQL statement looks like: > > string strSQLInsert = "INSERT INTO " + dbName + ".dbo." + tblName + " " + > "(" + > "CSS_Name," + > "CSS_DteStart" + > ") " + > "VALUES " + > "(" + > "'DatabaseCrossReferenceCount_**" + strNow + "'," + > "'" + strNow + "' " + > "); " + > "SELECT @@IDENTITY AS 'ID'" > ; > > PK = mExecNonQueryReturnIdentity(**cnn, strSQLInsert, 600); > > The record is inserted into the table but param in > mExecNonQueryReturnIdentity is {} which is null I suppose. As a result i > fall into the catch saying that the (int) "specified cast is not valid". I > am trying to cast a null to an int. But the question is why is the > returned value a null instead of an integer ID. > > There are a ton of hits on google about how to do this but they always > break down into quarrels about "This is not safe and that is not safe and > ...". All the safe issues should not apply in my specific case because I > am controlling the context by doing this from my C# code. > > I think the best solution seems to be doing the output parameter and > passing something back which is the ID but I can't seem to figure out which > part - the sql statement or the c# function (or both?) is in error. > > Any help greatly appreciated. > > -- > John W. Colby > Colby Consulting > > Reality is what refuses to go away > when you do not believe in it > > -- > AccessD mailing list > AccessD at databaseadvisors.com > http://databaseadvisors.com/**mailman/listinfo/accessd<http://databaseadvisors.com/mailman/listinfo/accessd> > Website: http://www.databaseadvisors.**com<http://www.databaseadvisors.com> >