当前位置: 代码迷 >> C# >> access 提醒至少一个参数没有被指定值
  详细解决方案

access 提醒至少一个参数没有被指定值

热度:101   发布时间:2016-05-05 04:32:33.0
access 提示至少一个参数没有被指定值

public void Display()
        {
            //清空数据源
            dt = (DataTable)dataGridView1.DataSource;
            if (dt != null && dt.Rows.Count > 0)
                dt.Rows.Clear();
            dataGridView1.DataSource = dt;
            string sql = "select BH,PhotoCount from tree";    //SQL语句
            OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, DBHelper.conn);   //定义一个dataAdapter
            dataAdapter.Fill(dataSet, "tree");   //填充数据集
            dataGridView1.DataSource = dataSet.Tables["tree"];  //填充数据进控件
        }
        public void UpdateDisplay()
        {
            //清空数据源
            dt = (DataTable)dataGridView1.DataSource;
            if (dt != null && dt.Rows.Count > 0)
                dt.Rows.Clear();
            dataGridView1.DataSource = dt;
            string sql = "UPDATE tree SET PhotoCount ='"+textBox2.Text+"' WHERE BH ="+textBox1.Text;    //SQL语句
            OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, DBHelper.conn);   //定义一个dataAdapter
            dataAdapter.Fill(dataSet, "tree");   //填充数据集
            dataGridView1.DataSource = dataSet.Tables["tree"];  //填充数据进控件
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Display();
        }
        //根据BH查询图片数量,同时更新PhotoCount
        private void button1_Click(object sender, EventArgs e)
        {
            textBox2.Text = "";
            string path = @"G:\\判断图片\\" + textBox1.Text;
            if (!System.IO.Directory.Exists(path))
            {
                MessageBox.Show("路径不存在");
                //Display();
            }
            else
            {
                //string count = System.IO.Directory.GetFiles(path).Count().ToString();
                //textBox2.Text = count;
                string[] file = System.IO.Directory.GetFiles(path);
                textBox2.Text += file.Length;
                UpdateDisplay();
            }

        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
               textBox1.Text= dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();
               //dataGridView1.Rows[e.RowIndex].Cells[1].Value=textBox2.Text;
            }
        }

------解决思路----------------------
google了下,应该是字段名错了。PhotoCount, BH字段在数据库里都有吗?另外不确定access是不是大小写敏感,也尽量匹配一下。

debug时看看sql的内容是什么?

------解决思路----------------------
SQL 语句不对
Dug看看SQL语句是什么,直接拿到access里执行看看,应该是报一样的错

从你下面的代码来看  textBox1.Text 应该是表的主键,同时也是一个文件夹的名称,你的SQL语句那么写,那么它应该是一个 数值类型的。你看看 textBox1.Text= dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString(); 这一句是不是没有赋上值,造成了textBox1.Text 为空的情况
      如果textBox1.Text 为空或者字符串类型的值,SQL的写法都是不正确的。
------解决思路----------------------
很费解你的UpdateDisplay方法。。。。
看上去像是重新提取数据,刷新DataGridView上的数据,但是却写个Update的Sql语句?这是要干什么呢?
------解决思路----------------------
Update语句,执行结果只会返回受影响的行数
你Fill是想干啥
------解决思路----------------------
查询才应该将结果填充
增,删,改,应该使用另一个返回结果是int型的函数去执行
------解决思路----------------------
引用:
Update语句,执行结果只会返回受影响的行数
你Fill是想干啥

+1

之前没注意,使用 dataAdapter.Fill(dataSet, "tree");  执行SQL不对
因为之前Display()已经Fill一次dataSet 中的tree表
在MSDN中说明
当使用后面的 Fill 调用来刷新 DataSet 的内容时,必须满足以下两个条件:                
1.该 SQL 语句应该与最初用来填充 DataSet 的语句匹配。                
2.必须存在键列信息。如果主键信息存在,则协调任何重复的行,并且这些重复行将只在与 DataSet 对应的 DataTable 中出现一次。可以通过 FillSchema(通过指定 DataTable 的 PrimaryKey 属性),或者通过将 MissingSchemaAction 属性设置为 AddWithKey 来设置主键信息。

总之,第一次Fill的时候,tree表的结构已经形成了,第二次Fill,执行SQL语句返回的数据表结构必须和第一次对应起来。
而Update语句返回受影响的行数,和第一次Select返回表结构无法对应
再就是Fill 之前的语句都是Select 语句,不能用Update
------解决思路----------------------
引用:
也就是说,不用重新填充,但是表已经更改过了对吧

你这样去执行,到底改没改,我也不确定,你需要自己去看到底改了没有
正常应该是调用另一个方法去执行insert,update和delete,而不要用fill
  相关解决方案