Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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
用于.Net的简单SQL语句生成器_.net_Sql_.net 2.0 - Fatal编程技术网

用于.Net的简单SQL语句生成器

用于.Net的简单SQL语句生成器,.net,sql,.net-2.0,.net,Sql,.net 2.0,我以自由职业者的身份跳进了一家大公司正在进行的.NET2.0Web应用程序项目。他们的DAL有许多手动构造和执行SQL语句的函数——其中许多函数冗长、混乱,因此难以理解和调试。我编写了一个简单的“sql帮助器”,可以编写如下内容: sqlh.addValue("name", name); sqlh.addValue("address, address); sqlh.addLiteral("created", "getDate()"); string sql = String.Format("I

我以自由职业者的身份跳进了一家大公司正在进行的.NET2.0Web应用程序项目。他们的DAL有许多手动构造和执行SQL语句的函数——其中许多函数冗长、混乱,因此难以理解和调试。我编写了一个简单的“sql帮助器”,可以编写如下内容:

sqlh.addValue("name", name); sqlh.addValue("address, address); sqlh.addLiteral("created", "getDate()"); string sql = String.Format("INSERT INTO [Table1] ({0}) values ({1})", sqlh.getInsertFields(), sqlh.getInsertValues()); sqlh.addValue(“名称”,名称); addValue(“地址,地址”); addLiteral(“已创建”,“getDate()”); string sql=string.Format(“插入[Table1]({0})值({1})”,sqlh.getInsertFields(),sqlh.getInsertValues(); 它可以处理空值,也可以用于更新

理想情况下,我会使用Microsoft Data Application block或LINQ或其他什么,但此时不可能进行重大的体系结构更改。这种方法为我节省了很多时间,但似乎最好使用“社区认可”的解决方案来解决问题

是否有一种流行的、轻量级的解决方案可以从微软或其他公司获得类似的结果

编辑


虽然到目前为止所描述的SqlParameter解决方案是对纯手动语句构建方法的改进,但我仍然更喜欢我的解决方案,即从查询中添加或删除字段只影响一行。还有更好的方法吗?感谢

SqLCommand和SqlParameter对象可能对您有用:

  Dim sc As New SqlClient.SqlCommand

  Dim sp As New SqlClient.SqlParameter("@value", SqlDbType.VarChar)
  sp.Value = "test"

  sc.Parameters.Add(sp)
  sc.CommandText = "select column1, column2 from table where column3=@value"

  sc.ExecuteReader()
它是vb.net,但你明白了。这将有助于防止sql注入,而且看起来整洁易读


别忘了设置连接字符串等。

我创建了自己的存储过程,根据给定的表架构创建insert语句,我觉得自己非常棒。然后我发现:

编辑


我知道我在上一篇SO帖子中找到了关于该脚本的内容,但我现在找不到它,如果其他人知道或知道,请编辑/或添加到评论中,我将进行编辑。

您可以从Microsoft获得多个选项:ADO.NET或Linq2Sql是目前最流行的。但是您提到的链接需要大量的工作才能转换从生成SQL到ORM的过程

< >为了使SQL的创建更加直接和安全,您应该考虑使用SQL参数。
using (SqlCommand saveCommand = DbUtil.CreateSqlCommand(context.Transaction)) {
    saveCommand.CommandText =
        "INSERT INTO Hit (" +
            "Id, PersonId, TeamId, PlayerId" +
        ") VALUES (" +
            "@Id, @PersonId, @TeamId, @PlayerId" +
        ")";

    DbUtil.AddParameter(saveCommand, "@Id", SqlDbType.UniqueIdentifier, Guid.NewGuid());
    DbUtil.AddParameter(saveCommand, "@PersonId", SqlDbType.UniqueIdentifier, hit.PersonId);
    DbUtil.AddParameter(saveCommand, "@TeamId", SqlDbType.UniqueIdentifier, hit.TeamId);
    DbUtil.AddParameter(saveCommand, "@PlayerId", SqlDbType.UniqueIdentifier, hit.PlayerId);

    saveCommand.ExecuteNonQuery();
}
这将把您的参数列表与SQL分开。我们的SQL也更加清晰。示例中的DbUtil只是我编写的一个帮助函数,用于从连接或事务创建SQL命令。与sqlh.addValue类似,我有一个DbUtil.AddParameter,它通过接收命令、变量名、数据类型和值来工作.下面是一个包含重载方法的示例:

internal static SqlParameter CreateSqlParameter(
    string parameterName,
    SqlDbType dbType,
    ParameterDirection direction,
    object value
) {
    SqlParameter parameter = new SqlParameter(parameterName, dbType);

    if (value == null) {
        value = DBNull.Value;
    }

    parameter.Value = value;
    parameter.Direction = direction;
    return parameter;
}

internal static SqlParameter AddParameter(
    SqlCommand sqlCommand,
    string parameterName,
    SqlDbType dbType
) {
    return AddParameter(sqlCommand, parameterName, dbType, null);
}

internal static SqlParameter AddParameter(
    SqlCommand sqlCommand,
    string parameterName,
    SqlDbType dbType,
    object value
) {
    return AddParameter(sqlCommand, parameterName, dbType, ParameterDirection.Input, value);
}

internal static SqlParameter AddParameter(
    SqlCommand sqlCommand,
    string parameterName,
    SqlDbType dbType,
    ParameterDirection direction,
    object value
) {
    SqlParameter parameter = CreateSqlParameter(parameterName, dbType, direction, value);
    sqlCommand.Parameters.Add(parameter);
    return parameter;
}

internal static SqlParameter AddParameter(
    SqlCommand sqlCommand,
    string parameterName,
    SqlDbType dbType,
    ParameterDirection direction
) {
    SqlParameter parameter = CreateSqlParameter(parameterName, dbType, direction, null);
    sqlCommand.Parameters.Add(parameter);
    return parameter;
}

你的getInsertValues()做什么?getInsertFields()=>“[姓名],[地址],[已创建]”getInsertValues()=>“'bill','123 Street','getDate()”他知道这些。这就是他试图抽象的东西。