用于.Net的简单SQL语句生成器
我以自由职业者的身份跳进了一家大公司正在进行的.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或其他什么,但此时不可能进行重大的体系结构更改。这种方法为我节省了很多时间,但似乎最好使用“社区认可”的解决方案来解决问题 是否有一种流行的、轻量级的解决方案可以从微软或其他公司获得类似的结果 编辑用于.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
虽然到目前为止所描述的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()”他知道这些。这就是他试图抽象的东西。