C# 如何在C上从ODBC获取参数查询
绑定参数后,如何在C上打印从ODBC解析的查询? 这是示例代码:C# 如何在C上从ODBC获取参数查询,c#,sql,parameters,odbc,C#,Sql,Parameters,Odbc,绑定参数后,如何在C上打印从ODBC解析的查询? 这是示例代码: cmd.CommandText = "SELECT * from user WHERE id = ?"; cmd.Prepare(); cmd.Parameters.Add("@id", OdbcType.Int).Value = 2; OdbcDataReader reader = cmd.ExecuteReader(); string query = cmd.????; // Here i need a method for
cmd.CommandText = "SELECT * from user WHERE id = ?";
cmd.Prepare();
cmd.Parameters.Add("@id", OdbcType.Int).Value = 2;
OdbcDataReader reader = cmd.ExecuteReader();
string query = cmd.????; // Here i need a method for get a full query
这在默认情况下是不可能的,因此您可以编写一个扩展,用参数值替换参数名 例如:
internal class Program
{
private static void Main(string[] args)
{
OdbcConnection connection = new OdbcConnection("");
OdbcCommand command = new OdbcCommand("SELECT * FROM Table WHERE Id = ? AND Column = ?", connection);
command.Parameters.Add("@id", OdbcType.Int).Value = 2;
command.Parameters.Add("@text", OdbcType.VarChar).Value = "test";
string preparedSql = command.GetPreparedSql();
// preparedSql =
Console.ReadLine();
}
}
public static class OdbcExtensions
{
public static string GetPreparedSql(this OdbcCommand command)
{
string[] splitted = command.CommandText.Split(new[] {'?'}, StringSplitOptions.RemoveEmptyEntries);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < splitted.Length; i++)
{
builder.Append(splitted[i]);
OdbcParameter param = command.Parameters[i];
switch (param.DbType)
{
case DbType.Boolean:
builder.Append(Convert.ToBoolean(param.Value) ? "1" : "0");
break;
case DbType.AnsiString:
builder.AppendFormat("'{0}'", param.Value);
break;
default:
builder.Append(param.Value);
break;
}
builder.Append(" ");
}
return builder.ToString();
}
}
这在默认情况下是不可能的,因此您可以编写一个扩展,用参数值替换参数名 例如:
internal class Program
{
private static void Main(string[] args)
{
OdbcConnection connection = new OdbcConnection("");
OdbcCommand command = new OdbcCommand("SELECT * FROM Table WHERE Id = ? AND Column = ?", connection);
command.Parameters.Add("@id", OdbcType.Int).Value = 2;
command.Parameters.Add("@text", OdbcType.VarChar).Value = "test";
string preparedSql = command.GetPreparedSql();
// preparedSql =
Console.ReadLine();
}
}
public static class OdbcExtensions
{
public static string GetPreparedSql(this OdbcCommand command)
{
string[] splitted = command.CommandText.Split(new[] {'?'}, StringSplitOptions.RemoveEmptyEntries);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < splitted.Length; i++)
{
builder.Append(splitted[i]);
OdbcParameter param = command.Parameters[i];
switch (param.DbType)
{
case DbType.Boolean:
builder.Append(Convert.ToBoolean(param.Value) ? "1" : "0");
break;
case DbType.AnsiString:
builder.AppendFormat("'{0}'", param.Value);
break;
default:
builder.Append(param.Value);
break;
}
builder.Append(" ");
}
return builder.ToString();
}
}
谢谢,但这不是我需要的:S因为第一个示例需要插入odbc类型的所有大小写,第二个无法工作,因为在查询中我只有一个问号?,我没有像@ID这样的字段别名。我明白你的意思,我更新了示例,希望它能进一步帮助你。谢谢,但这不是我需要的:S因为第一个示例需要插入odbc类型的所有大小写,第二个无法工作,因为在查询中我只有一个问号?,我没有像@ID这样的字段别名。我明白你的意思,我更新了示例,希望它能进一步帮助你。