Sql server 如何使用Web服务更新ASP.NET中的文本框控件?

Sql server 如何使用Web服务更新ASP.NET中的文本框控件?,sql-server,ado.net,asmx,webmethod,Sql Server,Ado.net,Asmx,Webmethod,我有一个web表单,我需要使用唯一的ID添加、更新、删除和读取。到目前为止,我已经成功地添加、更新和删除了一些功能,没有遇到什么麻烦 然而,现在我很难让我的read函数正常工作(我知道我有一个webform,它有四个文本字段:ID、FIRSTNAME、姓氏和地址)。基本上,当先前创建的ID(使用“添加”按钮)输入文本字段并单击“读取”按钮时,它应根据输入的ID使用存储的条目更新其他3个文本字段 这是我在web表单上的隐藏代码(cs) protected void cmdRead_Click(ob

我有一个web表单,我需要使用唯一的ID添加、更新、删除和读取。到目前为止,我已经成功地添加、更新和删除了一些功能,没有遇到什么麻烦

然而,现在我很难让我的read函数正常工作(我知道我有一个webform,它有四个文本字段:ID、FIRSTNAME、姓氏和地址)。基本上,当先前创建的ID(使用“添加”按钮)输入文本字段并单击“读取”按钮时,它应根据输入的ID使用存储的条目更新其他3个文本字段

这是我在web表单上的隐藏代码(cs)

protected void cmdRead_Click(object sender, EventArgs e)
{
   // Create a reference to the Web service
   DbWebService.WebService1 proxy = new DbWebService.WebService1();

   // Create a person details object to send to the Web service.
   string ADDRESS;
   string SURNAME;
   string FIRSTNAME;
   string ID;

   ADDRESS = txtAddress.Text;
   SURNAME = txtSurname.Text;
   FIRSTNAME = txtFirstname.Text;
   ID = txtID.Text;

   // Attempt to store in the Web service
   bool rsp = proxy.ReadPerson(int.Parse(ID), FIRSTNAME, SURNAME, ADDRESS);

   // Inform the user
   if (rsp)
   {
       lblOutcome.Text = "Successfully read data.";

       txtFirstname.Text = FIRSTNAME;
       txtSurname.Text = SURNAME;
       txtAddress.Text = ADDRESS;
   }
   else
   {
       lblOutcome.Text = "Failed to read data! Select a previously created ID!";
   }
}
这是我在web服务上的web功能(SQL Server Express数据库所在的位置)

}

现在的问题是,当我单击read时,我会收到一条成功消息(使用一个标签,您可以在后面的代码中看到),但字段不会更新,我假设这是因为(
rtn=true;
)语句。因此,我认为这样做可能会奏效:

rtn = (bool)reader["ADDRESS"];
然而,我得到一个指定的强制转换是无效的,所以我想可能bool在这个上下文中不起作用,我想如果我使用string,它可能会起作用,但是我如何转换,我认为rtn需要一个关于读取器的值,对吗


基本上,我只是在寻找一个解决方案,它将更新web表单中的文本字段

您的代码有几个问题。最明显的是,您的代码永远无法从数据库返回数据。您正在将
FIRSTNAME
等发送到web服务-您没有从web服务返回它们

没有理由让服务返回
bool
来告诉您是否成功。如果服务失败,让它抛出异常。相反,您应该从数据库中返回字段作为服务的返回

在职期间:

public class Person
{
    public string FIRSTNAME {get;set;}
    public string SURNAME {get;set;}
    public string ADDRESS {get;set;}
}

[WebMethod]        
public Person ReadPerson(int ID)        
{        
    // ...
    if (reader.Read()) 
    { 
        // A record exists, thus return the value
        Person p = new Person();
        p.FIRSTNAME = (string)reader["FIRSTNAME"]; 
        p.SURNAME = (string)reader["SURNAME"]; 
        p.ADDRESS = (string)reader["ADDRESS"]; 

        rtn = p;
   } 

    connection.Close();          

    return rtn; 
}           
此外,除非别无选择,否则不应使用WebMethod或ASMXWeb服务。ASMX是一种遗留技术,仅用于向后兼容。它不应该用于新的开发。您应该改用WCF


代码的其他问题解决如下:

[WebMethod]
public Person ReadPerson(int id)
{
    using (
        var connection =
            new SqlConnection(
                @"Data Source=.\SQLEXPRESS;
        AttachDbFilename='|DataDirectory|\Database.mdf';
        Integrated Security=True;
        User Instance=True")
        )
    {
        connection.Open();

        using (
            var command =
                new SqlCommand(@"
SELECT FIRSTNAME, SURNAME, ADDRESS 
FROM PersonalDetails 
WHERE ID = @id",
                    connection))
        {
            var idParameter =
                command.Parameters.Add(
                    "@id", SqlDbType.Int);
            idParameter.Value = id;

            using (var reader = command.ExecuteReader())
            {
                if (!reader.Read())
                {
                    return null;
                }

                return new Person
                            {
                                Firstname =
                                    (string)
                                    reader["FIRSTNAME"],
                                Surname =
                                    (string)
                                    reader["SURNAME"],
                                Address =
                                    (string)
                                    reader["ADDRESS"]
                            };
            }
        }
    }
}
主要问题是,
SqlConnection
SqlCommand
SqlDataReader
都需要在
内部使用
块进行实例化。这可以确保无论是否引发异常,对象都被释放(关闭)

其次,您不应该养成通过字符串操作构建查询的习惯;甚至不用String.Format。这使您容易受到“SQL注入”攻击。使用参数可以解决这个问题。请参阅MSDN中的“”


最后一个小问题:我建议你摆脱在显而易见的陈述上发表评论的习惯。例如,
Open
打开到数据库的连接,或者
return
返回一个值,不需要注释。

我该怎么做?抱歉,对sql来说非常陌生。我必须使用web方法和web服务,这是我任务的要求。您好,这很有意义,我已根据需要更改了web服务,但是我不确定在我的落后代码(cs.)中如何链接这两个服务。//试图存储在Web服务bool rsp=proxy.ReadPerson(int.Parse(ID)、FIRSTNAME、姓氏、地址)中;显然,我不应该在这里使用bool,但如果更改为string,我会得到错误(不能隐式地将bool转换为string)。我应该在这里做什么(查看代码aboce)嗨,这很有意义,我已经根据需要更改了web服务,但是我不确定在我的落后代码(cs.)中如何链接这两个服务。//试图存储在Web服务bool rsp=proxy.ReadPerson(int.Parse(ID)、FIRSTNAME、姓氏、地址)中;显然,我不应该在这里使用bool,但如果更改为string,我会得到错误(不能隐式地将bool转换为string)。我应该在这里做什么(看看代码aboce)都很好!我想起来了,非常感谢网络服务信息真的帮了我的忙,我真的很迷茫。非常感谢!!:)
[WebMethod]
public Person ReadPerson(int id)
{
    using (
        var connection =
            new SqlConnection(
                @"Data Source=.\SQLEXPRESS;
        AttachDbFilename='|DataDirectory|\Database.mdf';
        Integrated Security=True;
        User Instance=True")
        )
    {
        connection.Open();

        using (
            var command =
                new SqlCommand(@"
SELECT FIRSTNAME, SURNAME, ADDRESS 
FROM PersonalDetails 
WHERE ID = @id",
                    connection))
        {
            var idParameter =
                command.Parameters.Add(
                    "@id", SqlDbType.Int);
            idParameter.Value = id;

            using (var reader = command.ExecuteReader())
            {
                if (!reader.Read())
                {
                    return null;
                }

                return new Person
                            {
                                Firstname =
                                    (string)
                                    reader["FIRSTNAME"],
                                Surname =
                                    (string)
                                    reader["SURNAME"],
                                Address =
                                    (string)
                                    reader["ADDRESS"]
                            };
            }
        }
    }
}