GilbouFR
Обычно я немного жульничаю с ними.
Когда я читаю источник JSON, я хочу внедрить его в базу данных.
Сначала я пытался его правильно расшифровать и так далее.
Был грязным и не оптимизированным.
Поэтому я пошел грубым жестким путем : массовая вставка из потока JSON в таблицу, затем у меня есть хранимая процедура, которая захватывает данные из этой входной таблицы (где все вводится из JSON в виде строки), и процедура выполняет преобразования и тесты с помощью UPDATE/INSERT.
JSON - & gt; массовая вставка в TEMP_BLAH
Вызов (stored_procedure_blah): перемещение из TEMP_BLAH в BLAH
делаем либо вставку, если данных нет, либо обновление уже присутствует.
Это быстро. Он помещает временную таблицу, в которую сбрасываются данные JSON,
таким образом, внутренняя таблица с преобразованными данными хранится в безопасности для содержимого.
Сам код C# прост :
создать
HttpWebRequest
объект
Вы вводите в него URL-адрес JSON следующим образом :
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
Url Здесь содержит строку с URL-адресом JSON. Затем :
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
try
{
WebResponse response = request.GetResponse();
using (Stream responseStream = response.GetResponseStream())
{
StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
json = reader.ReadToEnd();
reader.Close();
}
}
catch (WebException ex)
{
WebResponse errorResponse = ex.Response;
using (Stream responseStream = errorResponse.GetResponseStream())
{
StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
Console.WriteLine(reader.ReadToEnd());
return some_errror_value;
}
}
(это код, написанный вручную и не проверенный, но вы получаете представление о том, как это сделать)
json - это строка. Теперь он содержит данные JSON.
Затем я использовать класс XmlDocument, чтобы десериализовать JSON-файла :
System.Xml.XmlDocument xml = JsonConvert.DeserializeXmlNode(json, TableName);
TableName-это переменная, содержащая имя таблицы, в которую я хочу ввести содержимое.
DataSet dataSet = new DataSet();
dataSet.ReadXml(XmlReader.Create(new StringReader(xml.InnerXml)), XmlReadMode.InferSchema);
Данных из XML в набор данных
Затем я открываю соединение с базой данных SQL и вводю данные, которые у меня есть, в виде массовой вставки :
SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();
ConnectionString
содержит вашу обычную строку подключения SQL
foreach(DataTable dt in dataSet.Tables)
{
string TableName = "[IMPORT_" + dt.TableName.Replace('{', ' ').Replace('}', ' ') + "]";
ExecuteNonQuery(conn, String.Format("DROP TABLE {0}", TableName));
SqlBulkCopy bulk = new SqlBulkCopy(conn);
bulk.DestinationTableName = TableName;
bulk.WriteToServer(dt);
}
static private bool ExecuteNonQuery(SqlConnection conn, string sql)
{
try
{
using (SqlCommand cmd = conn.CreateCommand())
{
Debug.WriteLine(sql);
cmd.CommandText = sql; cmd.ExecuteNonQuery();
}
Debug.WriteLine("ok");
return true;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return false;
}
}
И это делает объемную вставку работы.
Я написал все это так, как помню. Возможно, вам придется немного поработать для полного решения, но это даст вам представление о том, как я это делаю.
Это жестоко, но работает очень хорошо. У меня есть дюжина источников JSON, для каждого я хватаю JSON и впрыскиваю в таблицу IMPORT_blabla, используя BULK INSERT и отбрасывая существующую таблицу. Вы можете сделать усечение вместо падения, если хотите.
Затем у вас есть ваши данные в таблицах IMPORT_*, и хранимая процедура будет выполнять работу вставки/обновления по мере необходимости.