C# 在ASP.NET中将SQL查询结果写入Web窗体响应的简单方法是什么?
我需要一种简单的方法将SQL查询的结果(C# 在ASP.NET中将SQL查询结果写入Web窗体响应的简单方法是什么?,c#,php,asp.net,json,C#,Php,Asp.net,Json,我需要一种简单的方法将SQL查询的结果(SQLDataReader通过sqlcommand.ExecuteReader())写入Web表单响应(即,一些字符串写入Response.write(string))并以PHP中易于读取的格式写入。我曾考虑创建一个JSON对象,将其转换为字符串,然后将该JSON字符串写入响应,但我找不到一种简单的方法在Web表单中实现这一点 我的想法是: { "tableColumn1": "value", "tableColumn2": "value"} 但我不确定
SQLDataReader
通过sqlcommand.ExecuteReader()
)写入Web表单响应(即,一些字符串写入Response.write(string)
)并以PHP中易于读取的格式写入。我曾考虑创建一个JSON对象,将其转换为字符串,然后将该JSON字符串写入响应,但我找不到一种简单的方法在Web表单中实现这一点
我的想法是:
{ "tableColumn1": "value",
"tableColumn2": "value"}
但我不确定是否有一种简单的方法可以使用SqlDataReader实现这一点
最终目标是使用PHP使.NET环境中经常变化的表数据在Linux环境中易于读取。公共类myClass
public class myClass
{
public int myColumn { get; set; }
public string myColumn2 { get; set; }
}
public string MySqlMethod()
{
using (var conn = new SqlConnection("connectionString"))
{
var query = "SELECT * FROM SomeTable;";
var cmd = new SqlCommand(query, conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
var listToConvert = new List<myClass>();
while (dr.Read())
{
var toAdd = new myClass();
toAdd.myColumn = dr.GetInt32(dr.GetOrdinal("myColumn"));
toAdd.myColumn2 = dr.GetString(dr.GetOrdinal("myColumn2"));
listToConvert.Add(toAdd);
}
return GenerateJson(listToConvert);
}
}
public static string GenerateJson<T>(List<T> obj)
{
var returnString = "[";
var listCounter = 0;
foreach (var item in obj)
{
var counter = 0;
var props = item.GetType().GetProperties();
returnString += "{";
foreach (var prop in props)
{
returnString += "\"" + prop.Name + "\":" + "\"" + prop.GetValue(item, null) + "\"";
counter++;
if (counter != props.Count())
returnString += ",";
}
returnString += "}";
listCounter++;
if (listCounter != obj.Count())
returnString += ",";
}
returnString += "]";
return returnString;
}
{
public int myColumn{get;set;}
公共字符串myColumn2{get;set;}
}
公共字符串MySqlMethod()
{
使用(var conn=newsqlconnection(“connectionString”))
{
var query=“从SomeTable中选择*”;
var cmd=新的SqlCommand(查询,连接);
conn.Open();
SqlDataReader dr=cmd.ExecuteReader();
var listToConvert=新列表();
while(dr.Read())
{
var toAdd=新的myClass();
toAdd.myColumn=dr.GetInt32(dr.GetOrdinal(“myColumn”);
toAdd.myColumn2=dr.GetString(dr.GetOrdinal(“myColumn2”);
listToConvert.Add(toAdd);
}
返回GenerateJson(listToConvert);
}
}
公共静态字符串生成器(列表对象)
{
var returnString=“[”;
var-listCounter=0;
foreach(obj中的var项目)
{
var计数器=0;
var props=item.GetType().GetProperties();
returnString+=“{”;
foreach(道具中的var道具)
{
returnString+=“\”“+prop.Name+”\:“+”\”“+prop.GetValue(项,空)+“\”;
计数器++;
if(counter!=props.Count())
returnString+=“,”;
}
returnString+=“}”;
listCounter++;
if(listCounter!=obj.Count())
returnString+=“,”;
}
returnString+=“]”;
返回字符串;
}
这在WebForms中是完全“可行”的,这不是MVC特有的。
这方面的维护非常简单,只需对自定义类进行一个小的更改,并且在表更改时添加一些新的dr.GetWhatever
如果您想要一个更动态的解决方案,如果可能的话,我会研究实体框架。然后,您可以创建部分类来补充EF生成的自动生成类。此时维护几乎为空。在Page_Load事件中,您需要清除响应,然后使用以下代码手动处理:
string response = string.Format("[ \"tableColumn1\": \"{0}\",\"tableColumn2\":\"{2}\"]", value1, value2).Replace('[', '{').Replace(']', '}');
Response.Clear();
Response.ContentType = "application/json; charset=utf-8";
Response.Write(response );
Response.End();
尽管我很想这样做(我是MVC的超级粉丝),但我不确定我的同事是否能够在数据库中的表发生变化时维护类的变化。你可以让SqlDataReader将一条记录存储到字符串列表中,然后调整上面的方法来处理列表,这应该很简单。显然,我的同事没有我想象的那么坏。他们实际上是在为那张表创建一个类,所以你的回答很好地激发了我的灵感,使事情得以解决。谢谢为什么你不直接从PHP应用程序访问db?我希望我们可以,但我的老板不希望我们的内部网络和面向公众的网站之间建立连接。。。我想哪一种更安全。如果你必须从内部网络获取数据并将其公开在公共网络上,那么你必须在它们之间建立某种连接。也许你的老板更喜欢HTTP连接而不是直接db访问,这是一个值得怀疑的偏好。@MatteoSp,是的,我同意,但他就是这么做的,我不太可能改变这一点。虽然这并不能完全回答我的问题,但有点帮助,所以谢谢!