- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我有一个包含 27 列的站点位置信息数据库。我编写了一个批量导入功能,该功能采用 CSV 文件并允许您修改信息。当 CSV 文件的每一列中都包含信息时,一切正常,但当存在空字符串/空时,它会将空字符串推送到数据库并清除之前的内容。
为了能够快速更新数据库中的某些属性,我的客户只需要输入站点的主键(我已对导入进行编码以使其可更新)并填写任何其他属性,而无需填写其余部分。例如,某个位置的 CSV 文件可能如下所示:
SITE32,,,,BS,11111,,43607,123566789,123456789,2.2.2.2,1.1.1.1.1,1.1.1.1,0,Test,Test,Testing,2,12123,5002,N/A,4,00201,3,000,3703,5
假设该网站已存在于数据库中,我只想更新填写的字段。留空的字段应该保持不变。
这是我到目前为止的代码
protected void btnBulkSite_click(object sender, EventArgs e)
{
if (FileUpLoad1.HasFile)
{
FileUpLoad1.SaveAs(@"C:\temp\" + FileUpLoad1.FileName);
btnBulkSite.Text = "File Uploaded: " + FileUpLoad1.FileName;
}
else
{
btnBulkSite.Text = "No File Uploaded.";
}
DataTable tblcsv = new DataTable();
tblcsv.Columns.Add("SERVER_ID", typeof(string));
tblcsv.Columns.Add("SITE_NAME", typeof(string));
tblcsv.Columns.Add("SITE_ADDRESS", typeof(string));
tblcsv.Columns.Add("SITE_CITY", typeof(string));
tblcsv.Columns.Add("SITE_STATE", typeof(string));
tblcsv.Columns.Add("SITE_ZIPCODE", typeof(string));
tblcsv.Columns.Add("SITE_COUNTY", typeof(string));
tblcsv.Columns.Add("SITE_INTERNALZIP", typeof(string));
tblcsv.Columns.Add("SITE_PHONE_NUM", typeof(string));
tblcsv.Columns.Add("SITE_FAX_NUM", typeof(string));
tblcsv.Columns.Add("SERVER_SUBNET_ADDR", typeof(string));
tblcsv.Columns.Add("SERVER_IP_ADDR", typeof(string));
tblcsv.Columns.Add("SERVER_GATEWAY_ADDR", typeof(string));
tblcsv.Columns.Add("COSTCENTER_NUM");
tblcsv.Columns.Add("DCMF_NAME", typeof(string));
tblcsv.Columns.Add("LU_ID", typeof(string));
tblcsv.Columns.Add("XIDPU_ID", typeof(string));
tblcsv.Columns.Add("TRAININGSITE_IND");
tblcsv.Columns.Add("PBA_FICS_NUM");
tblcsv.Columns.Add("PBA_CITY_ID", typeof(string));
tblcsv.Columns.Add("REGION_NAME", typeof(string));
tblcsv.Columns.Add("SITETYPE_ID");
tblcsv.Columns.Add("PBA_OFFICE_ID", typeof(string));
tblcsv.Columns.Add("SITEORIGIN_ID");
tblcsv.Columns.Add("REGION_ID", typeof(string));
tblcsv.Columns.Add("PBA_BANK_ID", typeof(string));
tblcsv.Columns.Add("SITE_REGION_ID");
System.IO.StreamReader stream = new System.IO.StreamReader(FileUpLoad1.PostedFile.InputStream);
string ReadCSV = stream.ReadToEnd();
foreach (string csvRow in ReadCSV.Split('\n'))
{
if (!string.IsNullOrEmpty(csvRow))
{
tblcsv.Rows.Add();
int count = 0;
foreach (string FileRec in csvRow.Split(','))
{
tblcsv.Rows[tblcsv.Rows.Count - 1][count] = FileRec;
count++;
}
}
}
RemoveAllNullColumnsFromDataTable(tblcsv);
}
public void RemoveAllNullColumnsFromDataTable(DataTable tblcsv)
{
for (int h = 0; h < tblcsv.Rows.Count; h++)
{
if (tblcsv.Rows[h].IsNull(0) == true)
{
tblcsv.Rows[h].Delete();
}
}
tblcsv.AcceptChanges();
foreach (var column in tblcsv.Columns.Cast<DataColumn>().ToArray())
{
if (tblcsv.AsEnumerable().All(dr => dr.IsNull(column)))
tblcsv.Columns.Remove(column);
}
tblcsv.AcceptChanges();
InsertCSVRecords(tblcsv);
}
public void InsertCSVRecords(DataTable csvdt)
{
connection();
//SqlBulkCopy objbulk = new SqlBulkCopy(con);
var objbulk = new BulkOperation(con);
objbulk.AllowUpdatePrimaryKeys = true;
objbulk.DestinationTableName = "SITE_INFO";
objbulk.ColumnMappings.Add("SERVER_ID", "SERVER_ID", true);
objbulk.ColumnMappings.Add("SITE_NAME", "SITE_NAME");
objbulk.ColumnMappings.Add("SITE_ADDRESS", "SITE_ADDRESS");
objbulk.ColumnMappings.Add("SITE_CITY", "SITE_CITY");
objbulk.ColumnMappings.Add("SITE_STATE", "SITE_STATE");
objbulk.ColumnMappings.Add("SITE_ZIPCODE", "SITE_ZIPCODE");
objbulk.ColumnMappings.Add("SITE_COUNTY", "SITE_COUNTY");
objbulk.ColumnMappings.Add("SITE_INTERNALZIP", "SITE_INTERNALZIP");
objbulk.ColumnMappings.Add("SITE_PHONE_NUM", "SITE_PHONE_NUM");
objbulk.ColumnMappings.Add("SITE_FAX_NUM", "SITE_FAX_NUM");
objbulk.ColumnMappings.Add("SERVER_SUBNET_ADDR", "SERVER_SUBNET_ADDR");
objbulk.ColumnMappings.Add("SERVER_IP_ADDR", "SERVER_IP_ADDR");
objbulk.ColumnMappings.Add("SERVER_GATEWAY_ADDR", "SERVER_GATEWAY_ADDR");
objbulk.ColumnMappings.Add("COSTCENTER_NUM", "COSTCENTER_NUM");
objbulk.ColumnMappings.Add("DCMF_NAME", "DCMF_NAME");
objbulk.ColumnMappings.Add("LU_ID", "LU_ID");
objbulk.ColumnMappings.Add("XIDPU_ID", "XIDPU_ID");
objbulk.ColumnMappings.Add("TRAININGSITE_IND", "TRAININGSITE_IND");
objbulk.ColumnMappings.Add("PBA_FICS_NUM", "PBA_FICS_NUM");
objbulk.ColumnMappings.Add("PBA_CITY_ID", "PBA_CITY_ID");
objbulk.ColumnMappings.Add("REGION_NAME", "REGION_NAME");
objbulk.ColumnMappings.Add("SITETYPE_ID", "SITETYPE_ID");
objbulk.ColumnMappings.Add("PBA_OFFICE_ID", "PBA_OFFICE_ID");
objbulk.ColumnMappings.Add("SITEORIGIN_ID", "SITEORIGIN_ID");
objbulk.ColumnMappings.Add("REGION_ID", "REGION_ID");
objbulk.ColumnMappings.Add("PBA_BANK_ID", "PBA_BANK_ID");
objbulk.ColumnMappings.Add("SITE_REGION_ID", "SITE_REGION_ID");
con.Open();
objbulk.BulkUpdate(csvdt);
con.Close();
}
我的逻辑是,一旦从 CSV 文件导入信息,它就会移动到数据表中,如果它包含空值,则数据表中的列将被删除。因此,没有任何内容可以映射到 BulkUpdate 列映射,因此没有数据应推送到该列的数据库。
然而,由于某种原因,这不起作用,我不知道为什么......有更好的方法吗?
如有任何帮助,我们将不胜感激,谢谢。
最佳答案
有多种解决方案可以满足您的需求。
我看到的一个问题是,如果该人正在上传多行项目,并且这些行具有不同的数据(假设一行上的一列为空白,但在第二行上填充了),这将导致它中断,因为列将自行删除。
SITE32,,1,2,,...
SITE32,1,2,,,...
在这种情况下,第 1、3 和 4 列(此处从零开始)将被删除,因为它们具有空值,这将违背您的预期目的。仅当每行包含相同列中的数据时,您编写的逻辑才会起作用。
我建议将数据加载到临时表中并在 SQL 中完成任务,这将使您更好地控制数据加载过程。如果您有权访问数据库,请编写一个存储过程,然后将数据表的每一行传递到存储过程,并从那里执行更新插入操作。
SqlCommand cmd = new SqlCommand("",conn());
cmd.CommandText = "CREATE TABLE #tmp (
[SERVER_ID] NVARCHAR(MAX),
[SITE_NAME] NVARCHAR(MAX),
[SITE_ADDRESS] NVARCHAR(MAX),
[SITE_CITY] NVARCHAR(MAX),
[SITE_STATE] NVARCHAR(MAX),
[SITE_ZIPCODE] NVARCHAR(MAX),
[SITE_COUNTY] NVARCHAR(MAX),
[SITE_INTERNALZIP] NVARCHAR(MAX),
[SITE_PHONE_NUM] NVARCHAR(MAX),
[SITE_FAX_NUM] NVARCHAR(MAX),
[SERVER_SUBNET_ADDR] NVARCHAR(MAX),
[SERVER_IP_ADDR] NVARCHAR(MAX),
[SERVER_GATEWAY_ADDR] NVARCHAR(MAX),
[COSTCENTER_NUM] NVARCHAR(MAX),
[DCMF_NAME] NVARCHAR(MAX),
[LU_ID] NVARCHAR(MAX),
[XIDPU_ID] NVARCHAR(MAX),
[TRAININGSITE_IND] NVARCHAR(MAX),
[PBA_FICS_NUM] NVARCHAR(MAX),
[PBA_CITY_ID] NVARCHAR(MAX),
[REGION_NAME] NVARCHAR(MAX),
[SITETYPE_ID] NVARCHAR(MAX),
[PBA_OFFICE_ID] NVARCHAR(MAX),
[SITEORIGIN_ID] NVARCHAR(MAX),
[REGION_ID] NVARCHAR(MAX),
[PBA_BANK_ID] NVARCHAR(MAX),
[SITE_REGION_ID] NVARCHAR(MAX)
);
conn.Open();
cmd.ExecuteNonQuery();
SqlBulkCopy bc = new SqlBulkCopy();
bc.DestinationTableName = "#tmp";
bc.BulkCopyTimeout = 600;
bc.WriteToServer(dt);
bc.Close();
cmd.CommandText = "UPDATE t SET t.SERVER_ID = CASE WHEN tmp.SERVER_ID <> '' THEN tmp.SERVER_ID ELSE t.SERVER_ID END, ..... t.SITE_REGION_ID = CASE WHEN tmp.SITE_REGION_ID <> '' THEN tmp.SERVER_ID ELSE t.SERVER_ID END FROM Table t INNER JOIN #tmp AS tmp ON t.SERVER_ID = tmp.SERVER_ID";
cmd.ExecuteNonQuery();
conn.Close();
以上代码需要根据您的目的进行调整和修改。这只是一个例子。请注意,您的操作之间的连接无法关闭,否则临时表将被删除。您需要使用同一连接执行插入和更新。
关于C# - 导入 CSV,其中空字符串不会通过批量导入发送到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36653233/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!