+2002-10-04 Daniel Morgan <danmorg@sc.rr.com>
+
+ * SqlSharpCli.cs: modified
+ - fix compile errors due to mcs has better error checking
+ - fix exection of query with semicolon at end which resulted in an exception
+ - added support for ? postioned parameters
+ - added support for [] delimited named parameters
+ - misc. tidbits
+
2002-10-03 ville <vi64pa@koti.soon.fi>
* System.Data.SqlClient/AllTests.cs:
public void BuildParameters(IDbCommand cmd) {
ParametersBuilder parmsBuilder = \r
new ParametersBuilder(cmd, \r
- BindVariableCharacter.Semicolon);\r
+ BindVariableCharacter.Colon);\r
\r
- Console.WriteLine("GetParms...");\r
+ Console.WriteLine("Get Parameters (if any)...");\r
parmsBuilder.ParseParameters();\r
IList parms = (IList) cmd.Parameters;\r
\r
\r
string inValue = "";\r
bool found;\r
- found = GetInternalVariable(theParmName, out inValue);\r
- if(found == true) {\r
+ if(parmsBuilder.ParameterMarkerCharacter == '?') {\r
+ Console.Write("Enter Parameter " + \r
+ (p + 1).ToString() +\r
+ ": ");\r
+ inValue = Console.ReadLine();\r
prm.Value = inValue;\r
}\r
else {\r
- Console.Write("Enter Parameter " + (p + 1).ToString() +\r
- ": " + theParmName + ": ");\r
- inValue = Console.ReadLine();\r
- prm.Value = inValue;\r
+ found = GetInternalVariable(theParmName, out inValue);\r
+ if(found == true) {\r
+ prm.Value = inValue;\r
+ }\r
+ else {\r
+ Console.Write("Enter Parameter " + (p + 1).ToString() +\r
+ ": " + theParmName + ": ");\r
+ inValue = Console.ReadLine();\r
+ prm.Value = inValue;\r
+ }\r
}\r
}
parmsBuilder = null;
}
public void ExecuteSqlScalar(string sql) {
- Console.WriteLine("Execute SQL Non Query: " + sql);
+ Console.WriteLine("Execute SQL Scalar: " + sql);
IDbCommand cmd = null;
string retrievedValue = "";
conn = new OleDbConnection();
break;
case "POSTGRESQL":
+ // FIXME: System.Data.SqlClient should
+ // be used for MS SQL Server 7/2000
+ // and move the PostgreSQL provider
+ // to Mono.Data.PostgreSQL
+ // and use a connection class
+ // PgSqlConnection
conn = new SqlConnection();
break;
case "LOADEXTPROVIDER":
connectionString = "";
}
- public void ReadCommandsFromFile(StreamReader inCmds) {
- }
-
public void SetupOutputResultsFile(string[] parms) {\r
if(parms.Length != 2) {
Console.WriteLine("Error: wrong number of parameters");
if(build == null)
Console.WriteLine("SQL Buffer is empty.");
else
- Console.WriteLine("SQL Bufer\n" + buff);
+ Console.WriteLine("SQL Bufer:\n" + buff);
+ break;
default:
// Error
Console.WriteLine("Error: Unknown user command.");
build = new StringBuilder();
}
build.Append(entry);
- build.Append("\n");
+ //build.Append("\n");
buff = build.ToString();
ExecuteSql(buff);
build = null;
}
}
- enum BindVariableCharacter {\r
- Semicolon, // ';'\r
- At, // '@'\r
- QuestionMark // '?'\r
+ public enum BindVariableCharacter {\r
+ Colon, // ':' - named parameter - :name\r
+ At, // '@' - named parameter - @name\r
+ QuestionMark, // '?' - positioned parameter - ?\r
+ SquareBrackets // '[]' - delimited named parameter - [name]\r
}\r
\r
public class ParametersBuilder {\r
\r
private void SetBindCharacter() {\r
switch(bindCharSetting) {\r
- case BindVariableCharacter.Semicolon:\r
+ case BindVariableCharacter.Colon:\r
bindChar = ':';\r
break;\r
case BindVariableCharacter.At:\r
bindChar = '@';\r
break;\r
+ case BindVariableCharacter.SquareBrackets:\r
+ bindChar = '[';\r
+ break;\r
case BindVariableCharacter.QuestionMark:\r
bindChar = '?';\r
break;\r
SetBindCharacter();\r
} \r
\r
+ public char ParameterMarkerCharacter {\r
+ get {\r
+ return bindChar;\r
+ }\r
+ }\r
+\r
public int ParseParameters() { \r
\r
int numParms = 0;\r
}\r
else if(chars[i] == bindChar && \r
bStringConstFound == false) {\r
- StringBuilder parm = new StringBuilder();\r
- i++;\r
- while(i <= chars.Length) {\r
- char ch;\r
- if(i == chars.Length)\r
- ch = ' '; // a space\r
- else\r
- ch = chars[i];\r
+ if(bindChar != '?') {\r
+ StringBuilder parm = new StringBuilder();\r
+ i++;\r
+ if(bindChar.Equals('[')) {\r
+ bool endingBracketFound = false;\r
+ while(i <= chars.Length) {\r
+ char ch;\r
+ if(i == chars.Length)\r
+ ch = ' '; // a space\r
+ else\r
+ ch = chars[i];\r
\r
- if(Char.IsLetterOrDigit(ch)) {\r
- parm.Append(ch);\r
+ if(Char.IsLetterOrDigit(ch) || ch == ' ') {\r
+ parm.Append(ch);\r
+ }\r
+ else if (ch == ']') {\r
+ endingBracketFound = true;\r
+ string p = parm.ToString();\r
+ AddParameter(p);\r
+ numParms ++;\r
+ break;\r
+ }\r
+ else throw new Exception("SQL Parser Error: Invalid character in parameter name");\r
+ i++;\r
+ }\r
+ i--;\r
+ if(endingBracketFound == false)\r
+ throw new Exception("SQL Parser Error: Ending bracket not found for parameter");\r
}\r
else {\r
+ while(i <= chars.Length) {\r
+ char ch;\r
+ if(i == chars.Length)\r
+ ch = ' '; // a space\r
+ else\r
+ ch = chars[i];\r
\r
- string p = parm.ToString();\r
- AddParameter(p);\r
- numParms ++;\r
- break;\r
+ if(Char.IsLetterOrDigit(ch)) {\r
+ parm.Append(ch);\r
+ }\r
+ else {\r
+\r
+ string p = parm.ToString();\r
+ AddParameter(p);\r
+ numParms ++;\r
+ break;\r
+ }\r
+ i++;\r
+ }\r
+ i--;\r
}\r
- i++;\r
}\r
- i--;\r
+ else {\r
+ // placeholder paramaeter for ?\r
+ string p = numParms.ToString();\r
+ AddParameter(p);\r
+ numParms ++;\r
+ }\r
} \r
}\r
return numParms;\r
public void BuildParameters(IDbCommand cmd) {
ParametersBuilder parmsBuilder = \r
new ParametersBuilder(cmd, \r
- BindVariableCharacter.Semicolon);\r
+ BindVariableCharacter.Colon);\r
\r
- Console.WriteLine("GetParms...");\r
+ Console.WriteLine("Get Parameters (if any)...");\r
parmsBuilder.ParseParameters();\r
IList parms = (IList) cmd.Parameters;\r
\r
\r
string inValue = "";\r
bool found;\r
- found = GetInternalVariable(theParmName, out inValue);\r
- if(found == true) {\r
+ if(parmsBuilder.ParameterMarkerCharacter == '?') {\r
+ Console.Write("Enter Parameter " + \r
+ (p + 1).ToString() +\r
+ ": ");\r
+ inValue = Console.ReadLine();\r
prm.Value = inValue;\r
}\r
else {\r
- Console.Write("Enter Parameter " + (p + 1).ToString() +\r
- ": " + theParmName + ": ");\r
- inValue = Console.ReadLine();\r
- prm.Value = inValue;\r
+ found = GetInternalVariable(theParmName, out inValue);\r
+ if(found == true) {\r
+ prm.Value = inValue;\r
+ }\r
+ else {\r
+ Console.Write("Enter Parameter " + (p + 1).ToString() +\r
+ ": " + theParmName + ": ");\r
+ inValue = Console.ReadLine();\r
+ prm.Value = inValue;\r
+ }\r
}\r
}
parmsBuilder = null;
}
public void ExecuteSqlScalar(string sql) {
- Console.WriteLine("Execute SQL Non Query: " + sql);
+ Console.WriteLine("Execute SQL Scalar: " + sql);
IDbCommand cmd = null;
string retrievedValue = "";
conn = new OleDbConnection();
break;
case "POSTGRESQL":
+ // FIXME: System.Data.SqlClient should
+ // be used for MS SQL Server 7/2000
+ // and move the PostgreSQL provider
+ // to Mono.Data.PostgreSQL
+ // and use a connection class
+ // PgSqlConnection
conn = new SqlConnection();
break;
case "LOADEXTPROVIDER":
connectionString = "";
}
- public void ReadCommandsFromFile(StreamReader inCmds) {
- }
-
public void SetupOutputResultsFile(string[] parms) {\r
if(parms.Length != 2) {
Console.WriteLine("Error: wrong number of parameters");
if(build == null)
Console.WriteLine("SQL Buffer is empty.");
else
- Console.WriteLine("SQL Bufer\n" + buff);
+ Console.WriteLine("SQL Bufer:\n" + buff);
+ break;
default:
// Error
Console.WriteLine("Error: Unknown user command.");
build = new StringBuilder();
}
build.Append(entry);
- build.Append("\n");
+ //build.Append("\n");
buff = build.ToString();
ExecuteSql(buff);
build = null;
}
}
- enum BindVariableCharacter {\r
- Semicolon, // ';'\r
- At, // '@'\r
- QuestionMark // '?'\r
+ public enum BindVariableCharacter {\r
+ Colon, // ':' - named parameter - :name\r
+ At, // '@' - named parameter - @name\r
+ QuestionMark, // '?' - positioned parameter - ?\r
+ SquareBrackets // '[]' - delimited named parameter - [name]\r
}\r
\r
public class ParametersBuilder {\r
\r
private void SetBindCharacter() {\r
switch(bindCharSetting) {\r
- case BindVariableCharacter.Semicolon:\r
+ case BindVariableCharacter.Colon:\r
bindChar = ':';\r
break;\r
case BindVariableCharacter.At:\r
bindChar = '@';\r
break;\r
+ case BindVariableCharacter.SquareBrackets:\r
+ bindChar = '[';\r
+ break;\r
case BindVariableCharacter.QuestionMark:\r
bindChar = '?';\r
break;\r
SetBindCharacter();\r
} \r
\r
+ public char ParameterMarkerCharacter {\r
+ get {\r
+ return bindChar;\r
+ }\r
+ }\r
+\r
public int ParseParameters() { \r
\r
int numParms = 0;\r
}\r
else if(chars[i] == bindChar && \r
bStringConstFound == false) {\r
- StringBuilder parm = new StringBuilder();\r
- i++;\r
- while(i <= chars.Length) {\r
- char ch;\r
- if(i == chars.Length)\r
- ch = ' '; // a space\r
- else\r
- ch = chars[i];\r
+ if(bindChar != '?') {\r
+ StringBuilder parm = new StringBuilder();\r
+ i++;\r
+ if(bindChar.Equals('[')) {\r
+ bool endingBracketFound = false;\r
+ while(i <= chars.Length) {\r
+ char ch;\r
+ if(i == chars.Length)\r
+ ch = ' '; // a space\r
+ else\r
+ ch = chars[i];\r
\r
- if(Char.IsLetterOrDigit(ch)) {\r
- parm.Append(ch);\r
+ if(Char.IsLetterOrDigit(ch) || ch == ' ') {\r
+ parm.Append(ch);\r
+ }\r
+ else if (ch == ']') {\r
+ endingBracketFound = true;\r
+ string p = parm.ToString();\r
+ AddParameter(p);\r
+ numParms ++;\r
+ break;\r
+ }\r
+ else throw new Exception("SQL Parser Error: Invalid character in parameter name");\r
+ i++;\r
+ }\r
+ i--;\r
+ if(endingBracketFound == false)\r
+ throw new Exception("SQL Parser Error: Ending bracket not found for parameter");\r
}\r
else {\r
+ while(i <= chars.Length) {\r
+ char ch;\r
+ if(i == chars.Length)\r
+ ch = ' '; // a space\r
+ else\r
+ ch = chars[i];\r
\r
- string p = parm.ToString();\r
- AddParameter(p);\r
- numParms ++;\r
- break;\r
+ if(Char.IsLetterOrDigit(ch)) {\r
+ parm.Append(ch);\r
+ }\r
+ else {\r
+\r
+ string p = parm.ToString();\r
+ AddParameter(p);\r
+ numParms ++;\r
+ break;\r
+ }\r
+ i++;\r
+ }\r
+ i--;\r
}\r
- i++;\r
}\r
- i--;\r
+ else {\r
+ // placeholder paramaeter for ?\r
+ string p = numParms.ToString();\r
+ AddParameter(p);\r
+ numParms ++;\r
+ }\r
} \r
}\r
return numParms;\r