我正在开发一个Web应用程序,用户可以在其中将查询,锥形字符串和查询参数保存为app数据库中的一行表。稍后,应用程序将提供一个下拉列表,其中包含保存在数据库中的所有查询,用户可以选择要运行的所需查询。
我的问题是,我将使用以下格式进行查询:
select * from table where field = {0} and field = {1}
我将在数据库中有一个列,其中包含每个参数的确切数量和类型,如下所示:“D | N | S”,相应地指示日期,数字或字符串。
在应用程序中,我目前有一个控制器动作,它在一个字符串中检索查询,在另一个字符串中检索参数,所以在控制器中我知道查询有多少和哪种类型的参数,但我不能来有一个很好的解决方案,如何在视图中创建HTML控件,以便用户输入这些参数的值。由于我不知道查询有多少参数,直到控制器从数据库中获取它,我不确定如何继续。
提前致谢。
答案 0 :(得分:1)
这将有助于您入门:
它将在表单中添加动态输入元素。表单将指向控制器发布操作,该操作将接收 SqlParams 的列表,您可以在那里执行任何操作。
当然,您必须添加验证并根据需要进行调整,它看起来像这样:
服务器:
public class HomeController : Controller
{
public class SqlParams
{
public string Name { get; set; }
public string Value { get; set; }
public string ParamType { get; set; }
}
public ActionResult SQL()
{
return View();
}
[HttpPost]
public ActionResult SQL(List<SqlParams> sqlParams)
{
foreach (var item in sqlParams)
{
//Do whatever
string query = string.Format("{0} = {1}, {2}",item.Name,item.Value, item.ParamType);
}
return View();
}
}
观点:
<button type="button" onclick="Add();">Click to add param</button>
<form action="@Url.Action("SQL")" method="post">
<div id="controls">
</div>
<button type="submit">Save query</button>
</form>
@section scripts {
<script>
var counter = 0;
function Add() {
var html = "<label>Parameter Name: </label> <input name='sqlParams[" + counter + "].Name'/> <br/>" +
"<label>Parameter Value: </label> <input name='sqlParams[" + counter + "].Value'/> <br/>" +
"<label>Parameter Type: </label> <input name='sqlParams[" + counter + "].Type'/> <br/>";
counter++;
$("#controls").append(html);
}
</script>
}
答案 1 :(得分:0)
我会有一个查询和参数的类,查询中有一组参数。
public class SomeQueryClassName
{
public int QueryId { get; set; }
public string ConnectionString { get; set; }
public string CommandText { get; set; }
public List<SomeParameterClassName> Parameters { get; set; }
public SomeQueryClassName()
{
....
}
}
public class SomeParameterClassName
{
public string Name { get; set; }
public string Description { get; set; }
public string DataType { get; set; }
public object Value { get; set; }
public SomeParameterClassName()
{
....
}
}
然后在您的控制器中获取查询并返回参数列表作为您的模型。
public ActionResult GetQuery(int queryId)
{
var query =
return View(SomeFunctionToGetTheQuery(queryId).Select(x => x.Parameters).ToList());
}
public ActionResult RunQuery(List<SomeParameterClassName> parameters)
{
//some server side validation
//GetQueryResults will add the parameters and execute the query
return View(GetQueryResults(parameters);
}
然后在视图中
using (Html.BeginForm())
{
for (int i = 0; i < Model.Count; i++))
{
var parameter = Model [i];
<div class="formGroup">
<div class="labelDivClass">
<label class="labelClass>@parameter.Description</label>
</div>
<div class="inputDivClass">
<input type="text" name="[i].Value" class="someClassUsedForClientSideValidationBasedOnParameterDataType" />
<input type="hidden" name="[i].Name" value="@parameter.Name"/>
<input type="hidden" name="[I].DataType" value="@parameter.DataType"/>
</div>
</div>
}
}
确保在保存/执行查询时,您正在使用参数化查询并添加参数,而不是将值连接到查询中。
using (var connection = new SqlConnection("some connection string"))
{
connection.Open();
string cmd = "select * from testable where testcolumn = @testvalue";
using (var command = new SqlCommand(cmd,connection))
{
command.Parameters.AddWithValue("testvalue",somevalue);
//execute query and return data in a datatable or yield return objects
}
connection.Close();
}