Я создаю приложение WPF, где клиенты могут вставлять несколько записей в базу данных.
Минимальный лимит записей для вставки - 1000.
Я использовал ниже код, чтобы вставить его в С#.
var response = SearchEngine.Search(objSearchRequest);
if (response.ResponseStatus == SearchResponse.SearchResponseStatus.Success)
{
ImageClippingQueue objImageClippingQueue;
if (response.SearchResults.Count > 0)
{
foreach (var item in response.SearchResults)
{
objImageClippingQueue = new ImageClippingQueue();
objImageClippingQueue.ImageID = item.Value.ImageId;
objImageClippingQueue.pubid = item.Value.PubId;
new CommonMethods().InsertImageData(objImageClippingQueue);
}
UpdateClippingSearchKeyword(keywordId, response.TotalAvailableResults, (int)totalRecordsImported);
}
}
Этот метод InsertImageData
вставляет данные в базу данных.
Есть ли какой-либо быстрый способ, чтобы попасть в базу данных, должен быть один, а не ударять снова и снова.
благодаря
Вы можете использовать объемную вставку sql:
DataTable table = new DataTable("States");
// construct DataTable
table.Columns.Add(new DataColumn("id_state", typeof(int)));
table.Columns.Add(new DataColumn("state_name", typeof(string)));
// note: if "id_state" is defined as an identity column in your DB,
// row values for that column will be ignored during the bulk copy
table.Rows.Add("1", "Atlanta");
table.Rows.Add("2", "Chicago");
table.Rows.Add("3", "Springfield");
using(SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString))
{
bulkCopy.BulkCopyTimeout = 600; // in seconds
bulkCopy.DestinationTableName = "state";
bulkCopy.WriteToServer(table);
}
Для выполнения этой задачи я использовал процедуру хранилища.
-- To import multiple records into database
Create PROCEDURE SP_Importimagedata (
@xmlData XML
)
AS
BEGIN
INSERT INTO [imagedata](
ImageID,
ImageClippingStatusID,
[Priority],
UserID,
pubid,
ClipTypeID
)
SELECT
COALESCE([Table].[Column].value('ImageID[1]', 'int'),0) as 'ImageID',
[Table].[Column].value('ImageClippingStatusID[1]', 'int') as 'ImageClippingStatusID',
[Table].[Column].value(' Priority[1]', 'int') as 'Priority',
[Table].[Column].value(' UserID[1]', 'int') as 'UserID',
[Table].[Column].value(' pubid[1]', 'int') as 'pubid',
[Table].[Column].value(' ClipTypeID[1]', 'int') as 'ClipTypeID'
FROM @xmlData.nodes('/Images/Image') as [Table]([Column])
END
var response = SearchEngine.Search(objSearchRequest);
if (response.ResponseStatus == SearchResponse.SearchResponseStatus.Success)
{
if (response.SearchResults.Count > 0)
{
sbCreateDataXml = new StringBuilder();
sbCreateDataXml.Append("<Images>");
foreach (var item in response.SearchResults)
{
sbCreateDataXml.Append("<Image>");
sbCreateDataXml.Append("<ImageID>" + item.Value.ImageId + "</ImageID>");
sbCreateDataXml.Append("<ImageClippingStatusID>" + imageClippingStatusID + "</ImageClippingStatusID>");
sbCreateDataXml.Append("<Priority>" + priority + "</Priority>");
sbCreateDataXml.Append("<UserID>" + userID + "</UserID>");
sbCreateDataXml.Append("<pubid>" + item.Value.PubId + "</pubid>");
sbCreateDataXml.Append("<ClipTypeID>" + clipTypeID + "</ClipTypeID>");
sbCreateDataXml.Append("</Image>");
counter++;
}
sbCreateDataXml.Append("</Images>");
new CommonMethods().InsertImageClippingQueue(sbCreateDataXml.ToString());
totalRecordsImported = (int)totalRecordsImported + counter;
UpdateClippingSearchKeyword(keywordId, response.TotalAvailableResults, (int)totalRecordsImported);
}
}
Его работы лучше.
Пожалуйста, дайте мне знать, если мы сможем сделать это лучше, чем это.
Спасибо.
Вы можете использовать класс SqlBulkCopy
для вставки данных. Следующий пример был взят из http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy(v=vs.110).aspx
using (SqlBulkCopy bulkCopy =
new SqlBulkCopy(destinationConnection))
{
bulkCopy.DestinationTableName =
"dbo.BulkCopyDemoMatchingColumns";
try
{
// Write from the source to the destination.
bulkCopy.WriteToServer(reader);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
// Close the SqlDataReader. The SqlBulkCopy
// object is automatically closed at the end
// of the using block.
reader.Close();
}
}
Я сделал что-то похожее на следующее:
public static void insert(List<myRecord> records)
{
string sql = "insert into myTable (col1, col2) values ";
int i = 0;
foreach (record in records)
{
if (0 < i) sql += ",";
sql += "(@col1_" + i + ",@col2_" + i + ")";
++i;
}
SqlConnection conn = new SqlConnection(myConnStr);
SqlCommand cmd = new SqlCommand(sql, conn);
i = 0;
foreach (record in records)
{
cmd.Parameters.Add("@col1_" + i, System.Data.SqlDbType.Int).Value = record.Val1;
cmd.Parameters.Add("@col2_" + i, System.Data.SqlDbType.Int).Value = record.Val2;
++i;
}
// and so on...
}
Я также должен был ограничивать его только включением 500 записей за вставку, но это скрыто от клиента. Использование StringBuilder также будет улучшением.
InsertAllOnSubmit(obj)
.