【问题标题】:How to create a .NET web service to insert data in SQL Server 2008如何创建 .NET Web 服务以在 SQL Server 2008 中插入数据
【发布时间】:2011-08-30 14:44:17
【问题描述】:

我发现很难实现一个 .NET Web 服务来将数据插入到我在 SQL Server 2008 中创建的数据库中。实现以下代码后我被卡住了:

namespace DataService
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]

    // [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {
        [WebMethod]
        public string HelloWorld(String entity)
        {
            String firstName = "";
            SqlConnection myConnection = new SqlConnection(
                @"Data Source=.\SQLEXPRESS;" + 
                @"Initial Catalog=student;User ID=sa;Password=123");
            try
            {
                myConnection.Open();
                SqlCommand myCommand = new SqlCommand();
                myCommand.Connection = myConnection;
                myCommand.CommandText = "insert into stud values " +
                    "stud_name = '" + firstName + "'";

                SqlDataReader myReader = myCommand.ExecuteReader();

                //while
                if (myReader.Read())
                {
                    firstName = myReader["stud_name"].ToString();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            { 
                myConnection.Close();
            }

            return firstName;
        }
    }
}

这里的实体是我在表单中得到的 JSONArray:

[{"key0":"john","key2":"ann","key1":"joe"}]

我需要在数据库表中插入每个值,例如“john”。

【问题讨论】:

  • 你的例外是什么?您的 aspnet Worker 是否具有实际访问数据库所需的所有权限?另外您正在执行阅读器,为什么不执行非查询。此外,将该连接包装在 using 中。
  • 是的,这里可能会发生很多事情。调试它并找出异常是什么。可能正如@UrbanEsc 所说,您作为服务访问数据库的权限无效,或者您可能会通过不 Dispose()-ing 更快地释放池中的连接来耗尽数据库连接池。
  • 插入查询出现异常。我不知道如何执行非查询。你能告诉我怎么做吗?顺便说一句,我拥有 SQL Server 中数据库的访问权限。我正在本地主机上工作。插入部分给我带来了问题
  • 你应该用Newtonsoft.Json之类的东西序列化你收到的数据
  • @Nico:什么是 Newtonsoft.Json?我该如何使用它?如果我序列化 JSONArray 会发生什么?

标签: c# .net web-services json sql-server-2008


【解决方案1】:

Part_90:

首先,如果你从客户端获取 JSONArray,我建议你先在 List 中反序列化它

JavascripSerializer js = new JavascriptSerializer<List<sring>>();
List<string> recordsToInsert= js.Deserialize(entity);

然后,您可以通过循环遍历它们并将所有内容包含在事务中来插入表中的每条记录。

foreach(name in recordsToInsert)
{
 //perform the table insert here... 
 //Your SQL code seems correct to me. 
}

改进:Enclose the insert statements in a SQLTransaction.

编辑:添加一些代码来演示如何反序列化问题中提供的示例 JSON 字符串:

private static void DoSerializationTest()
    {
        string entity="{\"key0\":\"john\",\"key2\":\"ann\",\"key1\":\"joe\"}";
        JavaScriptSerializer js = new JavaScriptSerializer();

        Dictionary<string,string> result= js.Deserialize<Dictionary<string,string>>(entity);
        foreach (var item in result)
        {
            Console.WriteLine("Value: "+item.Value);
            Console.WriteLine("Key :"+item.Key);
        }
    }

【讨论】:

  • 我应该在哪里写序列化程序代码,我应该在我的Android应用程序中写它吗?
  • @Parth_90:不,JavascriptSerializer 是 .NET Framework 的一部分,您不需要编写它。请参阅此处的文档:msdn.microsoft.com/en-us/library/…
  • 序列化后我的输出是什么?我对 .NET 中的所有这些都是新手,请你帮我对代码提供更多的想法吗?
  • @Parth_90:C# 代码也在那里,只需单击带有 C# 名称的选项卡即可查看 C# 中的示例。
  • 序列化后我的输出是什么?我对 .NET 中的所有这些都是新手,请你帮我对代码提供更多的想法吗?
【解决方案2】:

您需要使用 ExecuteNonQuery(); 来执行您的命令; ExecuteReader 用于当您执行选择以从数据库中获取数据时。

  SqlCommand myCommand = new SqlCommand();
                    myCommand.Connection = myConnection;
                    myCommand.CommandText = "insert into stud values " +
                        "stud_name = '" + firstName + "'";
     if(myCommand.ExecuteNonQuery() > 0)
     {
         //The command executed with affected rows > 0, OK.
     }
     else
     {
         //No rows affected by the execution. Error management.
     }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    相关资源
    最近更新 更多