Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C上从ODBC获取参数查询_C#_Sql_Parameters_Odbc - Fatal编程技术网

C# 如何在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

绑定参数后,如何在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 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这样的字段别名。我明白你的意思,我更新了示例,希望它能进一步帮助你。