当我读取字段dt.Rows[0][j]
时,尽管excel表中包含数据,但我总是得到null
。
如何抑制由于存储为文本的号码而导致的错误?
这是我正在使用的代码。
using (SqlConnection con = new SqlConnection(consString))
{
con.Open();
for (int i = 2; i < dt.Rows.Count; i++)
{
for (int j = 1; j < dt.Columns.Count; j += 3)
{
try
{
var s3 = sheetName.Remove(sheetName.Length - 1);
s3 = s3.Replace("'", string.Empty);
s3 = s3.Replace("$", string.Empty);
if (s3[0] == '0') { s3 = s3.Remove(0, 1); }
if ((!dt.Rows[0][j].ToString().Contains("total")))
{
SqlCommand command = new SqlCommand("INSERT INTO [Budget]([CA TTC],[VAL MRG TTC],[CA HT],[VAL MRG HT],[Rayon],[Date],[Code Site],[Rayon Correspondance]) VALUES(@ca,@val,@catHT ,@valHT ,@rayon, @date ,@sheetName,null )", con);
command.Parameters.AddWithValue("@date", dt.Rows[i][0]);
command.Parameters.AddWithValue("@ca", dt.Rows[i][j]);
command.Parameters.AddWithValue("@val", dt.Rows[i][j + 1]);
command.Parameters.AddWithValue("@rayon", dt.Rows[0][j].GetType());
MessageBox.Show(dt.Rows[0][j].GetType().ToString());
command.Parameters.AddWithValue("@sheetName", s3);
command.Parameters.Add("@catHT", DBNull.Value).Value = DBNull.Value;
command.Parameters.Add("@valHT", DBNull.Value).Value = DBNull.Value;
command.ExecuteNonQuery();
}
}
我使用以下代码
阅读dt
var dt = new DataTable();
string query = string.Format("SELECT * FROM [{0}]", sheetName);
conn.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn);
adapter.Fill(dt);
答案 0 :(得分:0)
我坚信你在拥有数据的单元格和代码所指向的单元格之间感到困惑。请仔细检查dt.Rows[0][j]
所指的单元格。查看错误时j
的值是多少。这将帮助您缩小到相关单元格。
如果单元格中包含存储为文本的数字,则代码不会失败。这是一种测试它的简单方法。
创建Excel文件并将其另存为C:\MyFile.xlsx
。在单元格A2
中,键入'1
。 '
将确保将该号码存储为文本。
现在,使用此代码
private void button1_Click(object sender, EventArgs e)
{
System.Data.OleDb.OleDbConnection Conn;
Conn = new System.Data.OleDb.OleDbConnection(
"provider=Microsoft.Ace.OLEDB.12.0;Data Source='C:\\MyFile.xlsx';Extended Properties=Excel 12.0 XML;");
var dt = new DataTable();
string query = string.Format("SELECT * FROM [{0}]", "Sheet1$");
Conn.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter(query, Conn);
adapter.Fill(dt);
MessageBox.Show(dt.Rows[0][0].ToString());
}
您将在消息框中看到1
。