我正在尝试在.NET中构建一个Web服务,它将从mySQL数据库中检索数据。此Web服务稍后将与显示此数据的Windows窗体组合。
直到现在,我已经准备好了数据库,数据库和Web服务之间的连接已经完成,表单也已准备就绪。
但是,我无法从表格中检索特定的信息。任何人都可以帮我弄清楚我的下一步应该是什么?我在这个问题上搜索了很多,但我仍然无法找到关于这个问题的好教程...如果你有任何想法,那么你也可以发布链接吗?提前谢谢!
额外信息:假设一个名为“testdata”的样本表,其中有三列(“id”,“name”,“age”)。如何提取姓名和年龄并在表单上显示?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using MySql.Data;
using MySql.Data.MySqlClient;
namespace WebService2
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// [System.Web.Script.Services.ScriptService]
public class Service1 : System.Web.Services.WebService
{
private void connectoToMySql()
{
string connString = "SERVER=localhost" + ";" +
"DATABASE=testdatabase;" +
"UID=root;" +
"PASSWORD=password;";
MySqlConnection cnMySQL = new MySqlConnection(connString);
MySqlCommand cmdMySQL = cnMySQL.CreateCommand();
MySqlDataReader reader;
cmdMySQL.CommandText = "select * from testdata";
cnMySQL.Open();
reader = cmdMySQL.ExecuteReader();
//-----------------------------------------------------------
// This is the part where I should be able to retrieve the data from the database
//-----------------------------------------------------------
cnMySQL.Close();
}
}
}
答案 0 :(得分:6)
创建一个公共的方法,用WebMethodAttribute标记,并返回一个DataTable(如果您的使用者是.net客户端)。让消费者调用该方法并使用DataTable执行任何操作。
[System.Web.Services.WebMethod]
public DataTable connectoToMySql()
{
string connString = "SERVER=localhost" + ";" +
"DATABASE=testdatabase;" +
"UID=root;" +
"PASSWORD=password;";
MySqlConnection cnMySQL = new MySqlConnection(connString);
MySqlCommand cmdMySQL = cnMySQL.CreateCommand();
MySqlDataReader reader;
cmdMySQL.CommandText = "select * from testdata";
cnMySQL.Open();
reader = cmdMySQL.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(reader);
cnMySQL.Close();
return dt;
}
答案 1 :(得分:2)
你有几个选择。
首先,您可以摆脱DataReader,而是使用DataAdapter填充DataSet并返回完整的DataSet。 (这可能是最简单的,但如果您打算从非.NET应用程序调用它,那么它是最不友好的。)
其次,您实际上可以使用阅读器,循环遍历数据以填充您的函数应该返回的任何业务对象......但是您没有给我们足够的信息来告诉您如何执行此操作。
无论哪种方式,你的函数现在都没有返回任何内容,你甚至没有在WebMethod上标记过......我强烈建议你回到MSDN获取示例。或观看此视频:http://www.asp.net/web-forms/videos/how-do-i/how-do-i-create-and-call-a-simple-web-service-in-aspnet
现在,您的代码和问题表明您还没有理解基础知识(这没有任何问题 - 我们都从某个地方开始),这个视频将覆盖它们。目前,您需要的帮助超出我们在此论坛中提供的帮助,而不是向您展示在哪里可以找到您需要的信息。 (我希望我已经完成了。)
答案 2 :(得分:2)
调用webservice时,需要调用一个返回数据的方法。
您需要以下部分:
[WebMethod()]
public UserRecord[] GetUserRecords()
{
List<UserRecod> userRecords = new List<UserRecord>();
string connString = "SERVER=localhost" + ";" +
"DATABASE=testdatabase;" +
"UID=root;" +
"PASSWORD=password;";
//introduce a connection with mySQL database
using(MySqlConnection cnMySQL = new MySqlConnection(connString))
{
//create your mySql command object
using(MySqlCommand cmdMySQL = cnMySQL.CreateCommand())
{
//set the command text (query) of the mySQL command object
cmdMySQL.CommandText = "select * from testdata";
cmdMySql.CommandType = CommandType.Text;
cmdMySql.Connection = cnMySql;
cnMySql.Open();
//create your mySQL reader object
using(MySqlDataReader reader = cmdMySQL.ExecuteReader())
{
while(reader.Read())
{
userRecords.Add(new UserRecord() { Id = reader.GetInt32(reader.GetOrdinal("id"), Name = reader.GetString(reader.GetOrdinal("name")}
}
}
}
}
return userRecords.ToArray();
}
您可能希望返回一个对象:
public class UserRecord
{
public UserRecord() { }
public int Id { get; set; }
public string Name { get; set; }
}
请注意,这只是一个示例,您可能不会以这种方式构建代码。例如,您实际上可能会在UserRecord上放置一个返回用户记录的方法,这将与数据访问类或类似方法交互以连接到数据库。这样你就可以在任何地方分享UserRecord。
您可能还想考虑要返回的内容。 DataTable适用于.Net客户端,但非常繁重。最好只包含您需要的数据的轻量级对象。
请注意,您还希望将DAO调用包装在Using语句中。这样可以确保在离开最后一个使用语句时(或者如果抛出异常)正确处理数据访问对象。
答案 3 :(得分:1)
获得阅读器后,您可以使用以下内容遍历每一行:
while (reader.Read())
{
int id = (Int32)reader["MyId"];
string name = reader["Name"] as String;
}
您还可以使用阅读器填充DataSet对象,如果您只想从Web服务返回该对象,这可能会有所帮助:
DataSet ds = new DataSet();
ds.Load(reader, LoadOption.OverwriteChanges, "TestData");
我还建议您在完成阅读后关闭阅读器:
reader.Close();