1

如果我有这样的代码:

public T ExecuteQuery<T>(Func<IDataReader, T> getResult, string query, params IDataParameter[] parameters)
{
        using (SqlConnection conn = new SqlConnection(this.DefaultConnectionString))
        {
            conn.Open();

            // Declare the parameter in the query string
            using (SqlCommand command = new SqlCommand(query, conn))
            {
                foreach (var parameter in parameters)
                {
                    command.Parameters.Add(parameter);
                }

                command.Prepare();

                using (SqlDataReader dr = command.ExecuteReader())
                {
                    return getResult(dr);
                }
            }
        }
    }

    public string GetMySpecId(string dataId)
    {
        return ExecuteQuery(
            dr =>
            {
                if (dr.Read())
                {
                    return dr[0].ToString();
                }

                return string.Empty;
            },
            @"select ""specId"" from ""MyTable"" where ""dataId"" = :dataId",
            new SqlParameter("dataId", dataId));
    }
}

我如何确保

new SqlParameter("dataId", dataId)); 

一段代码是在传递一个文本还是一个整数?还有@"select..."我熟悉的实际工作方式:

 select id from mytable where dataId = @dataID;
4

1 回答 1

0

我不确定参数是否正确。看看下面修改过的代码,它将确保正确添加参数并简化调用的构造ExecuteQuery(当然在我看来)。这很简单。select 语句已正确参数化,因为它使用以下@varname语法:

"select \"specId\" from \"MyTable\" where \"dataId\" = @dataId"

此外,由于该方法,参数输入正确AddWithValue

command.Parameters.AddWithValue(parameter.Key, parameter.Value);

最后,使用字典发送参数使得从任何结构构造参数变得非常简单,无论是参数值,甚至是对象。

public T ExecuteQuery<T>(Func<IDataReader, T> getResult, string query, Dictionary<string, object> parameters)
{
    using (SqlConnection conn = new SqlConnection(this.DefaultConnectionString))
    {
        conn.Open();

        // Declare the parameter in the query string
        using (SqlCommand command = new SqlCommand(query, conn))
        {
            foreach (var parameter in parameters)
            {
                command.Parameters.AddWithValue(parameter.Key, parameter.Value);
            }

            command.Prepare();

            using (SqlDataReader dr = command.ExecuteReader())
            {
                return getResult(dr);
            }
        }
    }
}

public string GetMySpecId(string dataId)
{
    return ExecuteQuery(
        dr =>
        {
            if (dr.Read())
            {
                return dr[0].ToString();
            }

            return string.Empty;
        },
        "select \"specId\" from \"MyTable\" where \"dataId\" = @dataId",
        new Dictionary<string, object>() { { "@dataId", dataId } });
}

PS -@您示例中的字符串之前只是 C# 中使用的转义序列。

于 2012-12-05T20:30:23.877 回答