没有给出一个或多个必需参数错误的值 - Excel

时间:2018-03-20 12:39:01

标签: c# .net excel winforms datagridview

我从excel获取数据并在DataGridWiew中显示它 我有两个文本框,一个是第一个记录的起始索引,另一个是最后一个记录。

代码工作正常。但是我们假设开始记录是1而结尾是10当我将10改为1或2时它会给我一个错误:

adapter.Fill(dataTable中);

完整代码如下:

public DataSet Parse(string fileName)
{
    string connectionString = string.Format("provider = Microsoft.Jet.OLEDB.4.0; data source = {0}; Extended Properties = Excel 8.0;", fileName);

    DataSet data = new DataSet();

    foreach (var sheetName in GetExcelSheetNames(connectionString))
    {
        using (OleDbConnection con = new OleDbConnection(connectionString))
        {
            string query = "";
            var dataTable = new DataTable();
            if(tbStarting.Text.Trim()=="" && tbEnding.Text.Trim() == "")
            {
                query = string.Format("SELECT * FROM [{0}]", sheetName);
            }
            else
            {
                query = string.Format("SELECT * FROM [{0}] where SrNo between " + int.Parse(tbStarting.Text.Trim()) + " and " + int.Parse(tbEnding.Text.Trim()) + " order by SrNo", sheetName);
            }
            con.Open();
            OleDbDataAdapter adapter = new OleDbDataAdapter(query, con);

            adapter.Fill(dataTable);
            data.Tables.Add(dataTable);
            con.Close();
        }
    }
    return data;
}
static string[] GetExcelSheetNames(string connectionString)
{
    OleDbConnection con = null;
    DataTable dt = null;
    con = new OleDbConnection(connectionString);
    con.Open();
    dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

    if (dt == null)
    {
        return null;
    }

    String[] excelSheetNames = new String[dt.Rows.Count];
    int i = 0;

    foreach (DataRow row in dt.Rows)
    {
        excelSheetNames[i] = row["TABLE_NAME"].ToString();
        i++;
    }

    return excelSheetNames;
}

为什么会这样,请帮助我?

1 个答案:

答案 0 :(得分:0)

查看代码,当您要求检索每个表中的所有记录时,您的过程似乎正常。但是你没有显示实际使用过哪种表(Sheet)。

有可能,你只使用第一个。

当您提交一些参数时,只有一个表(表格)可以满足这些要求。其他人可能没有,可能是因为名为[SrNo]的字段不存在 尝试应用过滤器时,这会导致需要更多参数错误。

与错误无关,但值得注意的是:您不需要重新创建整个DataSet + DataTable来过滤您的数据源。

The DataSet.Tables[N].DefaultView.RowFilter可用于获得相同的结果,而无需在每次需要过滤器时销毁所有对象。
RowFilter在语言方面有一些限制(例如,不支持BETWEEN,必须使用Field >= Value1 AND Field <= Value2),但它非常有效。

这是一种可能的设置:
xDataSet是实际DataSet

的占位符
//Collect the values in the TextBoxes in a string array
private void button1_Click(object sender, EventArgs e)
{
    string[] Ranges = new string[] { tbStarting.Text.Trim(), tbEnding.Text.Trim() };

    if (xDataSet != null)
        FilterDataset(Ranges);
}


private void FilterDataset(string[] Ranges)
{
    if (string.IsNullOrEmpty(Ranges[0]) & string.IsNullOrEmpty(Ranges[1]))
        xDataSet.Tables[0].DefaultView.RowFilter = null;
    else if (string.IsNullOrEmpty(Ranges[0]) | string.IsNullOrEmpty(Ranges[1]))
        return;
    else if (int.Parse(Ranges[0]) < int.Parse(Ranges[1]))
        xDataSet.Tables[0].DefaultView.RowFilter = string.Format("SrNo >= {0} AND SrNo <= {1}", Ranges[0], Ranges[1]);
    else
        xDataSet.Tables[0].DefaultView.RowFilter = string.Format("SrNo = {0}", Ranges[0]);

    this.dataGridView1.Update();
}

我已经修改了你的代码,你可以稍微编码来处理这些要求 (无论如何,我已经离开了这些过滤器;它们没有被使用,但是如果你仍然需要它们,它们处于工作状态)

DataSet xDataSet = new DataSet();
string WorkBookPath = @"[Excel WorkBook Path]";
//Query one Sheet only. More can be added if necessary
string[] WBSheetsNames = new string[] { "Sheet1" };

//Open the Excel document and assign the DataSource to a dataGridView
xDataSet = Parse(WorkBookPath, WBSheetsNames, null);
dataGridView1.DataSource = xDataSet.Tables[0];
dataGridView1.Refresh();


public DataSet Parse(string fileName, string[] WorkSheets, string[] ranges)
{
    if (!File.Exists(fileName)) return null;
    string connectionString = string.Format("provider = Microsoft.ACE.OLEDB.12.0; " + 
                                            "data source = {0}; " + 
                                            "Extended Properties = \"Excel 12.0;HDR=YES\"", 
                                             fileName);
    DataSet data = new DataSet();
    string query = string.Empty;

    foreach (string sheetName in GetExcelSheetNames(connectionString))
    {
        foreach (string WorkSheet in WorkSheets)
            if (sheetName == (WorkSheet + "$"))
            {
                using (OleDbConnection con = new OleDbConnection(connectionString))
                {
                    DataTable dataTable = new DataTable();
                    if ((ranges == null) || 
                        (string.IsNullOrEmpty(ranges[0]) || string.IsNullOrEmpty(ranges[1])) ||
                        (int.Parse(ranges[0]) > int.Parse(ranges[1]))) 
                        query = string.Format("SELECT * FROM [{0}]", sheetName);

                    else if ((int.Parse(ranges[0]) == int.Parse(ranges[1])))
                        query = string.Format("SELECT * FROM [{0}] WHERE SrNo = {1}", sheetName, ranges[0]);
                    else
                        query = string.Format("SELECT * FROM [{0}] WHERE (SrNo BETWEEN {1} AND {2}) " +
                                              "ORDER BY SrNo", sheetName, ranges[0], ranges[1]);
                    con.Open();
                    OleDbDataAdapter adapter = new OleDbDataAdapter(query, con);

                    adapter.Fill(dataTable);
                    data.Tables.Add(dataTable);
                };
            }
    }
    return data;
}

static string[] GetExcelSheetNames(string connectionString)
{
    string[] excelSheetNames = null;
    using (OleDbConnection con = new OleDbConnection(connectionString))
    {
        con.Open();
        using (DataTable dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null))
        {
            if (dt != null)
            {
                excelSheetNames = new string[dt.Rows.Count];
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    excelSheetNames[i] = dt.Rows[i]["TABLE_NAME"].ToString();
                }
            }
        }
    }
    return excelSheetNames;
}