From: Pavol S. <pa...@st...> - 2003-02-04 13:58:31
|
can i use 2 fbCommands with one fbConnection and one fbTransaction or have i create separate connection or transaction for each fbCommand??? this example throws exception: FbConnection dbConn = new FbConnection(fConnString); try { dbConn.Open(); FbTransaction dbTran = dbConn.BeginTransaction(); if (fID < 0) { string genQuery = "SELECT GEN_ID(GENARTICLEID, 1) FROM RDB$DATABASE"; FbCommand dbCmd2 = new FbCommand(genQuery, dbConn, dbTran); dbCmd2.ExecuteScalar(); } FbCommand dbCmd = new FbCommand(query, dbConn, dbTran); dbCmd.Prepare(); dbCmd.Parameters.Add("xID", fID); dbCmd.ExecuteNonQuery(); dbTran.Commit(); } finally { dbConn.Close(); } and exception is: Unhandled Exception: System.InvalidOperationException: Command Connection is not equal to Transaction Connection. at FirebirdSql.Data.Firebird.FbCommand.Prepare() at NovyCas.DBArticle.SaveArticle() in C:\Projekty\NetStarek\NovyCas\DBArticle .cs:line 221 at Tests.TestDBArticleCreateSaveGet() in C:\Projekty\NetStarek\Tests\Main.cs: line 42 at Tests.Main(String[] args) in C:\Projekty\NetStarek\Tests\Main.cs:line 61 Press any key to continue . . . |
From:
<car...@te...> - 2003-02-04 15:09:57
|
Hello: > can i use 2 fbCommands with one fbConnection and one fbTransaction > or > have i create separate connection or transaction for each fbCommand??? > > this example throws exception: > FbConnection dbConn = new FbConnection(fConnString); > try { > dbConn.Open(); > > FbTransaction dbTran = dbConn.BeginTransaction(); > if (fID < 0) { > string genQuery = "SELECT GEN_ID(GENARTICLEID, 1) FROM > RDB$DATABASE"; > FbCommand dbCmd2 = new FbCommand(genQuery, dbConn, dbTran); > dbCmd2.ExecuteScalar(); > } > FbCommand dbCmd = new FbCommand(query, dbConn, dbTran); > > dbCmd.Prepare(); > dbCmd.Parameters.Add("xID", fID); > dbCmd.ExecuteNonQuery(); > dbTran.Commit(); > } > finally { > dbConn.Close(); > } I going to see it , one question are you testing with CVS sources?? In older versions there a error when using ExecutingScalar that is fixed in CVS. Best regards Carlos Guzmán Álvarez Vigo-Spain |
From: Pavol S. <pa...@st...> - 2003-02-05 11:36:06
|
Carlos Guzm=E1n =C1lvarez wrote: > Hello: > >> can i use 2 fbCommands with one fbConnection and one fbTransaction >> or >> have i create separate connection or transaction for each fbCommand??? >> >> this example throws exception: >> FbConnection dbConn =3D new FbConnection(fConnString); >> try { >> dbConn.Open(); >> FbTransaction dbTran =3D dbConn.BeginTransaction(); >> if (fID < 0) { >> string genQuery =3D "SELECT GEN_ID(GENARTICLEID, 1) FROM=20 >> RDB$DATABASE"; >> FbCommand dbCmd2 =3D new FbCommand(genQuery, dbConn, dbTran); >> dbCmd2.ExecuteScalar(); >> } >> FbCommand dbCmd =3D new FbCommand(query, dbConn, dbTran); >> dbCmd.Prepare(); >> dbCmd.Parameters.Add("xID", fID); >> dbCmd.ExecuteNonQuery(); >> dbTran.Commit(); >> } >> finally { >> dbConn.Close(); >> } > > > > I going to see it , one question are you testing with CVS sources?? In=20 > older versions there a error when using ExecutingScalar that is fixed i= n > CVS. > i think, that ExecuteSclalar is working fine , but when i use same=20 connection and transaction for two different commands there is=20 exception, that transactions in trans and conn are different... I will=20 try it with your build... Again thanx for that... by the way... I wan to help you improve helps, so i will send you=20 modified xml files... and you said that you implemented named parameters??? I was looking for=20 that in sources yesterday but i didnt find it :( p. |
From:
<car...@te...> - 2003-02-05 12:34:00
|
Hello: > i think, that ExecuteSclalar is working fine , but when i use same > connection and transaction for two different commands there is > exception, that transactions in trans and conn are different... I will > try it with your build... Again thanx for that... Ok, tell to me if you continue to experience this problem. > by the way... I wan to help you improve helps, so i will send you > modified xml files... Ok without problems. > and you said that you implemented named parameters??? I was looking for > that in sources yesterday but i didnt find it :( See in FbStatement.cs, this it's a really simple modification but it's working well in my tests ( ideas are welcome :) ), GetInSqlda was modified and there are a new method: /// <include file='xmldoc/fbstatement.xml' path='doc/member[@name="M:GetInSqlda"]/*'/> private XSQLDA GetInSqlda() { XSQLDA in_sqlda = statement.InSqlda; Encoding encoding = Connection.Encoding; Regex search = new Regex("(@([a-zA-Z-$][a-zA-Z0-9_$]*).)"); string parameterName = String.Empty; if (in_sqlda == null) { return in_sqlda; } MatchCollection matches = search.Matches(CommandText); for (int i = 0; i < in_sqlda.sqln; i++) { try { parameterName = matches[i].Value.Trim(); } catch { parameterName = parameters[i].ParameterName; } if (parameters[parameterName].Value == System.DBNull.Value) { if ((in_sqlda.sqlvar[i].sqltype & 1 ) == 0) { throw new InvalidOperationException("Input parameter value cannot be null."); } else { in_sqlda.sqlvar[i].sqlind = -1; in_sqlda.sqlvar[i].sqldata = null; } } else { long multiplier = 1; if (in_sqlda.sqlvar[i].sqlscale < 0) { int exp = in_sqlda.sqlvar[i].sqlscale*(-1); multiplier = (long)System.Math.Pow(10, exp); } switch (in_sqlda.sqlvar[i].sqltype & ~1) { case GdsCodes.SQL_TEXT: case GdsCodes.SQL_VARYING: in_sqlda.sqlvar[i].sqldata = encoding.GetBytes((string)parameters[parameterName].Value); in_sqlda.sqlvar[i].sqllen = encoding.GetByteCount((string)parameters[parameterName].Value); break; case GdsCodes.SQL_SHORT: if (in_sqlda.sqlvar[i].sqlscale < 0) { decimal paramValue = Convert.ToDecimal(parameters[parameterName].Value.ToString()); in_sqlda.sqlvar[i].sqldata = Convert.ToInt16(paramValue*multiplier); } else { in_sqlda.sqlvar[i].sqldata = Convert.ToInt16(parameters[parameterName].Value.ToString()); } break; case GdsCodes.SQL_LONG: if (in_sqlda.sqlvar[i].sqlscale < 0) { decimal paramValue = Convert.ToDecimal(parameters[parameterName].Value.ToString()); in_sqlda.sqlvar[i].sqldata = Convert.ToInt32(paramValue*multiplier); } else { in_sqlda.sqlvar[i].sqldata = Convert.ToInt32(parameters[parameterName].Value.ToString()); } break; case GdsCodes.SQL_FLOAT: in_sqlda.sqlvar[i].sqldata = float.Parse(parameters[parameterName].Value.ToString()); break; case GdsCodes.SQL_DOUBLE: case GdsCodes.SQL_D_FLOAT: in_sqlda.sqlvar[i].sqldata = Convert.ToDouble(parameters[parameterName].Value.ToString()); break; case GdsCodes.SQL_BLOB: if (in_sqlda.sqlvar[i].sqlsubtype == 1) { FbClob clob = new FbClob(Connection, Transaction); in_sqlda.sqlvar[i].sqldata = clob.Write( Convert.ToString(parameters[parameterName].Value)); } else { FbBlob blob = new FbBlob(Connection, Transaction); in_sqlda.sqlvar[i].sqldata = blob.Write((byte[])parameters[parameterName].Value); } break; case GdsCodes.SQL_ARRAY: // TODO: Write array data break; case GdsCodes.SQL_QUAD: case GdsCodes.SQL_INT64: if (in_sqlda.sqlvar[i].sqlscale < 0) { decimal paramValue = Convert.ToDecimal(parameters[parameterName].Value.ToString()); in_sqlda.sqlvar[i].sqldata = Convert.ToInt64(paramValue*multiplier); } else { in_sqlda.sqlvar[i].sqldata = Convert.ToInt64(parameters[parameterName].Value.ToString()); } break; case GdsCodes.SQL_TIMESTAMP: case GdsCodes.SQL_TYPE_TIME: case GdsCodes.SQL_TYPE_DATE: in_sqlda.sqlvar[i].sqldata = DateTime.Parse(parameters[parameterName].Value.ToString()); break; default: throw new NotSupportedException("Unknown data type"); } } } return in_sqlda; } /// <summary> /// Format the Command Text string and subst the parameters names by ? /// </summary> private string ParseCommandText(string commandText) { string sqlText = commandText; if(Parameters.Count != 0) { foreach(FbParameter parameter in parameters) { /* If ParameterName Starts with "@" replace * ParameterName with ? */ if (parameter.ParameterName.StartsWith("@")) { sqlText = sqlText.Replace(parameter.ParameterName, "?"); } } } return sqlText; } Best regards Carlos Guzmán Álvarez Vigo-Spain |
From:
<car...@te...> - 2003-02-05 16:02:56
|
Hello: > and you said that you implemented named parameters??? I was looking for > that in sources yesterday but i didnt find it :( I have commited to the CVS a little changes on this, please if you can get it. Best regards Carlos Guzmán Álvarez Vigo-Spain |