【问题标题】:Inserting value from API to database将值从 API 插入数据库
【发布时间】:2019-09-12 19:23:44
【问题描述】:

我创建了一个从 API 获取信息的 ConsoleApplication,然后应该将其中一个值放入数据库中的表中。一切正常(例如获取值并用它们填充对象数据),但我似乎无法找到将其推送到数据库的方法。

class Program
{
static void Main(string[] args)
{
    HttpClient cons = new HttpClient();
    cons.BaseAddress = new Uri("APPURL");
    cons.DefaultRequestHeaders.Accept.Clear();
    cons.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
    MyAPIGet(cons).Wait();
}

static async Task MyAPIGet(HttpClient cons)
{

    using (cons)
    {
        HttpResponseMessage res = await cons.GetAsync("");
        res.EnsureSuccessStatusCode();
        if (res.IsSuccessStatusCode)
        {
            VirtualProduct virtualProduct = await res.Content.ReadAsAsync<VirtualProduct>();
            Console.WriteLine("\n");
            Console.WriteLine("---------------------Calling Get Operation------------------------");
            Console.WriteLine("\n");
            Console.WriteLine("Id    Name          ");
            Console.WriteLine("-----------------------------------------------------------");
            Console.WriteLine("{0}\t{1}\t", virtualProduct.Id, virtualProduct.Header);
            Console.ReadLine();

            using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString))
            {
                string insertQuery = @"UPDATE VirtualProduct SET ProductImageId = @Id WHERE Name='@Header';";

                var result = db.Execute(insertQuery, virtualProduct);
            }

        }
    }
}
}

运行后,一切正常,但我的数据库没有更新。调试后发现using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString))有如下错误:

ServerVersion = '((System.Data.SqlClient.SqlConnection)db).ServerVersion' 引发了“System.InvalidOperationException”类型的异常

连接字符串非常好,我仔细检查了app.config,看起来像这样:

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
  </configSections>
  <connectionStrings>
    <add connectionString="Server= SERVER.database.windows.net;Database=SERVER_dev;User Id=user; Password=asd;" name="DefaultConnectionString" providerName="System.Data.SqlClient"/>
  </connectionStrings>
</configuration>

【问题讨论】:

  • 发布 full 异常,而不仅仅是它的一部分。您可以使用Exception.ToString() 轻松获取完整的异常,包括调用堆栈。没有 IDbConnection.Insert 方法,这意味着您正在使用其他库,也许是 Dapper?
  • db.Open() 放在using 之后,错误得到修复。但是,尽管如此,数据库仍然没有得到更新。您对我仍然做错什么有任何想法吗?
  • @Questieme 我的回答对您有帮助吗?如果它帮助您解决问题,请在下方发表评论。跟踪你在做什么会更容易。另外,result 你的价值是多少?

标签: c# sql-server console-application


【解决方案1】:

in this answer 所述,试试这个:

using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString))
{
    string insertQuery = @"UPDATE VirtualProduct SET ProductImageId = @Id WHERE Name='@Header';";
    if (db.State==ConnectionState.Closed)
    {                      
        db.Open();   
    }
    var result = db.Execute(insertQuery, virtualProduct);
}

使用using 语句后,using 代码块中声明的所有内容都会被释放。

【讨论】:

  • @AndreiDragotoniu 感谢您的建议,但我也包含了编辑过的 OP 代码。
  • 那时您应该将其标记为重复。在任何情况下都不要复制您不理解的代码 - 您可能会得到针对原始 asnwer 的反对票。这个答案是完全错误的。新连接已关闭,没有理由检查其状态。
猜你喜欢
  • 2023-02-02
  • 2012-09-10
  • 2023-04-02
  • 2018-12-31
  • 1970-01-01
  • 2021-07-25
  • 2018-11-09
相关资源
最近更新 更多