iT邦幫忙

0

新手發問c# 如何把第三方api抓到的json檔匯入SQL(已解決)

不明 2022-10-04 14:01:472013 瀏覽
  • 分享至 

  • xImage

我之前是用實體資料庫模型打進去
但後來發現好像可以不用
改用字串連進db
我想知道怎麼樣才能把我抓到的第三方api的json資料打入db
已經有在實體db建好跟json資料相對應的欄位了


            using (SqlConnection con = new SqlConnection(Connstr))
            {
                con.Open();
                string targetURI = "第三方api網址";

                HttpClient client = new HttpClient();
                client.MaxResponseContentBufferSize = Int32.MaxValue;
                var response = await client.GetStringAsync(targetURI);
                //ViewBag.Result = Regex.Unescape(response);
                var pharmacies = JsonConvert.DeserializeObject<List<Inserch>>(response);
                using (SqlCommand cmd = new SqlCommand("Insert Into Pharmacy(欄位一,欄位二,欄位三,欄位四,欄位五,欄位六) values(@欄位一,@欄位二,@欄位三,@欄位四,@欄位五,@欄位六) ", con))
                {
                    foreach (var data in pharmacies)
                    {
                        cmd.Parameters.AddWithValue("data", data);
                        cmd.Parameters.Add(new SqlParameter("欄位一", data.欄位一));
                        cmd.Parameters.Add(new SqlParameter("欄位二", data.欄位二));
                        cmd.Parameters.Add(new SqlParameter("欄位三", data.欄位三));
                        cmd.Parameters.Add(new SqlParameter("欄位四", data.欄位四));
                        cmd.Parameters.Add(new SqlParameter("欄位五", data.欄位五));
                        cmd.Parameters.Add(new SqlParameter("欄位六", data.欄位六));
                        cmd.ExecuteNonQuery();
                    }
                }
                con.Close();
                return pharmacies;
            }
        }
    }

我目前是這樣寫
但是沒有成功打進去
想知道要怎改呢@@
順便問一下如果之後要撈出來呈現在view的話
是不是在這邊
data.欄位一;的後面直接加Tostring()比較好呢
麻煩各位大大了

科科 iT邦研究生 1 級 ‧ 2022-10-05 10:00:37 檢舉
你的foreach (var data in pharmacies) 要放在
using (SqlCommand cmd = new SqlCommand("Insert Into Pharmacy(欄位一,欄位二,欄位三,欄位四,欄位五,欄位六) values(@欄位一,@欄位二,@欄位三,@欄位四,@欄位五,@欄位六) ", con))
外面
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
科科
iT邦研究生 1 級 ‧ 2022-10-04 15:10:40
最佳解答

用try catch 包起來看有沒有發生錯誤

新手學會怎麼除錯對以後有幫助


我只講最關鍵的

你的foreach (var data in pharmacies) 要放在
using (SqlCommand cmd = new SqlCommand("Insert Into Pharmacy(欄位一,欄位二,欄位三,欄位四,欄位五,欄位六) values(@欄位一,@欄位二,@欄位三,@欄位四,@欄位五,@欄位六) ", con))
外面

我自己測試有寫入

看更多先前的回應...收起先前的回應...

變老鳥後老闆問要怎麼解決問題
:try

科科 iT邦研究生 1 級 ‧ 2022-10-05 10:04:28 檢舉

已經說用try catch 查看錯誤了,不知為何不做?
我自己用,一下就看到錯誤訊息改好程式碼了

不明 檢舉

回復大大
我昨天後來有成功寫入了
有改了一點方式
您說的也對,我的迴圈確實要放在外層
至於try catch 的部分
可能我也還不熟悉
昨天試沒看出個所以然
我會再繼續增進自己的
也謝謝不吝嗇指教

科科 iT邦研究生 1 級 ‧ 2022-10-05 12:26:32 檢舉

ADO.NET 是比較古老但基礎的寫法,
等你練習的比較多,熟悉SQL語法後,
可以改學Dapper、EntityFramework。

然後try catch 可以這樣寫,Exception會顯示出錯誤訊息。

try
{
  //主程式碼
  
}
catch (Exception e)
{
   throw new Exception(e.Message);
}
0
PPTaiwan
iT邦好手 1 級 ‧ 2022-10-04 15:19:17

如果你的資料庫是 SQL SERVER 2016 以上有支援 JSON ,可以直接用 SQL 來拆解並寫到資料庫裡面去。

(個人)覺得這樣子的方式很適合,可以參考 MSDN 的相關說明 MSDN SQL JSON

0
allenlwh
iT邦高手 1 級 ‧ 2022-10-04 15:27:18

我個人建議,最好還是要做反序列化,將json反解回來,再做DB的處理

public class Student
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public string Sex { get; set; }
    }

string json = @"{ 'Name':'王小明','Age':'8','ID':'1','Sex':'男'}";
Student descStudent = JsonConvert.DeserializeObject<Student>(json);//反序列化
Console.WriteLine(string.Format("反序列化: ID={0},Name={1},Sex={2},Sex={3}", descStudent.ID, descStudent.Name, descStudent.Age, descStudent.Sex));
反序列化: ID=1,Name=王小明,Sex=8,Sex=男
1
海綿寶寶
iT邦大神 1 級 ‧ 2022-10-04 16:01:37
     string json = @"{
        'Email': 'james@example.com',
        'Active': true,
        'CreatedDate': '2013-01-20T00:00:00Z',
        'Roles': [
          'User',
          'Admin'
        ]
      }";
        
                 Account account = JsonConvert.DeserializeObject<Account>(json);
                 string connstr = @"connstr";
                 SqlConnection connection = new SqlConnection(connstr);
                 connection.Open();
                 string listvalue = string.Join(",", account.Roles);
                 string sql = "insert into Account(Email,Active,CreatedDate,Roles) values(@Email,@Active,@CreatedDate,@Roles)";
                 SqlCommand cmd = new SqlCommand(sql, connection);
                 cmd.Parameters.AddWithValue("@Email",account.Email);
                 cmd.Parameters.AddWithValue("@Active", account.Active);
                 cmd.Parameters.AddWithValue("@CreatedDate", account.CreatedDate);
                 cmd.Parameters.AddWithValue("@Roles",listvalue);
                 cmd.ExecuteNonQuery();
                 connection.Close();

資料來源

不明 檢舉

已經解決了:)

我要發表回答

立即登入回答