sql数据库查询结果存入二维数组,结果都是0?求帮助

.Net技术 码拜 9年前 (2015-05-10) 1245次浏览 0个评论

           

 SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "select top 10 工件材料,主偏角,前角,刀具直径,刀齿数,铣削速度,铣削深度,进给量  from 加工实例数据.dbo.铣刀实例 where 加工方式=@加工方式 and 刀具材料=@刀具材料 and 刀具寿命<>null";
            cmd.Connection = conn;
            SqlParameter parajgfs = new SqlParameter("@加工方式", SqlDbType.VarChar);
            parajgfs.Value = ddl_jgfs.SelectedValue;
            cmd.Parameters.Add(parajgfs);
            SqlParameter paradjcl = new SqlParameter("@刀具材料", SqlDbType.VarChar);
            paradjcl.Value = ddl_djcl.SelectedValue;
            cmd.Parameters.Add(paradjcl);
            SqlDataReader data = cmd.ExecuteReader();
            double[,] day1 = new double[10, 8];
            while (data.Read())
            {
                for (int i = 0; i < 10; i++)
                {
                    for (int j = 0; j < 8; j++)
                    { 
                        day1[i,j] = Convert.ToDouble(data[i*8+j]);
                    }
                }   
            }
            data.Close();
            SqlCommand cmd2 = new SqlCommand();
            cmd2.CommandText = "select top 10 刀具寿命 from 加工实例数据.dbo.铣刀实例 where 加工方式=@加工方式2 and 刀具材料=@刀具材料2 and 刀具寿命<>null";
            cmd2.Connection = conn;
            SqlParameter parajgfs2 = new SqlParameter("@加工方式2", SqlDbType.VarChar);
            parajgfs2.Value = ddl_jgfs.SelectedValue;
            cmd2.Parameters.Add(parajgfs2);
            SqlParameter paradjcl2 = new SqlParameter("@刀具材料2", SqlDbType.VarChar);
            paradjcl2.Value = ddl_djcl.SelectedValue;
            cmd2.Parameters.Add(paradjcl2);
            SqlDataReader data1 = cmd2.ExecuteReader();
            double[,] day2 = new double[10, 1];
            while (data1.Read())
            {
                for (int i = 0; i < 10; i++)
                {
                   
                        day2[i, 0] = Convert.ToDouble(data1[i]);
                 
                }
            }
            
            data1.Close();

我的目的是分别将查询结果存入day1和day2两个数组中,但是通过上述代码对数组赋值操作后,数组内的数字都为0?
这是为什么???

你这个代码不报错?
在dr里面用双重循环!
引用 1 楼 starfd 的回复:

你这个代码不报错?
在dr里面用双重循环!

没有报错啊,应该怎么写?

// 摘要: 
        //     获取位于指定索引处的列。
        //
        // 参数: 
        //   i:
        //     要获取的列的从零开始的索引。
        //
        // 返回结果: 
        //     作为 System.Object 位于指定索引处的列。
        //
        // 异常: 
        //   System.IndexOutOfRangeException:
        //     传递的索引位于 0 至 System.Data.IDataRecord.FieldCount 的范围之外。
        object this[int i] { get; }

除非你没查到数据,否则必定异常

Convert.ToDouble(data[i*8+j])这一段极端情况下就是9*8+7,按你的sql必定异常

非得用数组?干嘛不用SqlDataAdapter?Fill到一个DataTable里面,然后再去循环或绑定,该有啥就有啥了。
引用 3 楼 starfd 的回复:
// 摘要: 
        //     获取位于指定索引处的列。
        //
        // 参数: 
        //   i:
        //     要获取的列的从零开始的索引。
        //
        // 返回结果: 
        //     作为 System.Object 位于指定索引处的列。
        //
        // 异常: 
        //   System.IndexOutOfRangeException:
        //     传递的索引位于 0 至 System.Data.IDataRecord.FieldCount 的范围之外。
        object this[int i] { get; }

除非你没查到数据,否则必定异常

Convert.ToDouble(data[i*8+j])这一段极端情况下就是9*8+7,按你的sql必定异常

我这是查出十条数据,每条数据包括8个列,一共80个数据,9*8+7=79,不会报错,我想问为什么数据传递不到数组中?

引用 4 楼 jjkk168 的回复:

非得用数组?干嘛不用SqlDataAdapter?Fill到一个DataTable里面,然后再去循环或绑定,该有啥就有啥了。

因为我后面运算要用数组,求问我这个程序哪出问题了?

引用 5 楼 zz0834 的回复:
Quote: 引用 3 楼 starfd 的回复:
// 摘要: 
        //     获取位于指定索引处的列。
        //
        // 参数: 
        //   i:
        //     要获取的列的从零开始的索引。
        //
        // 返回结果: 
        //     作为 System.Object 位于指定索引处的列。
        //
        // 异常: 
        //   System.IndexOutOfRangeException:
        //     传递的索引位于 0 至 System.Data.IDataRecord.FieldCount 的范围之外。
        object this[int i] { get; }

除非你没查到数据,否则必定异常

Convert.ToDouble(data[i*8+j])这一段极端情况下就是9*8+7,按你的sql必定异常

我这是查出十条数据,每条数据包括8个列,一共80个数据,9*8+7=79,不会报错,我想问为什么数据传递不到数组中?

while (data.Read())每while一次,就会将一行数据填充,也就是你的8列,你还觉得不会报错?

引用 7 楼 starfd 的回复:
Quote: 引用 5 楼 zz0834 的回复:
Quote: 引用 3 楼 starfd 的回复:
// 摘要: 
        //     获取位于指定索引处的列。
        //
        // 参数: 
        //   i:
        //     要获取的列的从零开始的索引。
        //
        // 返回结果: 
        //     作为 System.Object 位于指定索引处的列。
        //
        // 异常: 
        //   System.IndexOutOfRangeException:
        //     传递的索引位于 0 至 System.Data.IDataRecord.FieldCount 的范围之外。
        object this[int i] { get; }

除非你没查到数据,否则必定异常

Convert.ToDouble(data[i*8+j])这一段极端情况下就是9*8+7,按你的sql必定异常

我这是查出十条数据,每条数据包括8个列,一共80个数据,9*8+7=79,不会报错,我想问为什么数据传递不到数组中?

while (data.Read())每while一次,就会将一行数据填充,也就是你的8列,你还觉得不会报错?

哦,那应该怎么写啊?求指导

你可以向上面说的,先Fill到DataSet,然后对于DataSet你就可以循环处理了,因为DataTable本质上也是二维表格
先不吐槽你的data
说说data1的逻辑,应该是这样的

double[,] day2 = new double[100, 10];//100行,10列.这里多少行要根据你数据库里到底有多少行而定,绝对不是10行1列
            int rownum=0;//行号,从0开始
while (data1.Read())
            {
                for (int i = 0; i < 10; i++)
                {
                    
                        day2[rownum, i] = Convert.ToDouble(data1[i]);//填充第rownum行,第i列
                  
                }
rownum++;//自增,准备填充下一行
            }

你之前的逻辑,每次读一行数据,就反复填充到数组里,那么数组里最后当然只剩下最后一行的数据,之前的都被覆盖掉了

10分
data1的逻辑如果你想明白了
那么data其实一样
你是把其中一行的79列数据给填充进二维数组

而不是把每一行数据填充进数组的其中一行里

第一个SQL出的结果有80个字段么? 并且全要转成 double 类型值, 太粗暴了
引用 12 楼 tcmakebest 的回复:

第一个SQL出的结果有80个字段么? 并且全要转成 double 类型值, 太粗暴了

人笨所以简单粗暴,想不出啥更好的方法

引用 9 楼 starfd 的回复:

你可以向上面说的,先Fill到DataSet,然后对于DataSet你就可以循环处理了,因为DataTable本质上也是二维表格

能不能麻烦帮忙写个小代码学习一下,您这么直接说,我也不懂啊。

引用 11 楼 Z65443344 的回复:

data1的逻辑如果你想明白了
那么data其实一样
你是把其中一行的79列数据给填充进二维数组

而不是把每一行数据填充进数组的其中一行里

我用你的方法修改了一下data1,然后输出了day2,结果都还是0。确定数据库中有数据

10分
断点跟,看while循环到底执行了几次,data1.Read()返回的是什么

数据库中有数据,不代表你的SQL语句能查询到数据

仔细检查查询条件

20分
引用 14 楼 zz0834 的回复:
Quote: 引用 9 楼 starfd 的回复:

你可以向上面说的,先Fill到DataSet,然后对于DataSet你就可以循环处理了,因为DataTable本质上也是二维表格

能不能麻烦帮忙写个小代码学习一下,您这么直接说,我也不懂啊。

            string strSQL = "Select * from blah blah";
            using (SqlConnection conn = new SqlConnection("ConnectionString"))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(strSQL, conn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable();
                da.Fill(dt);

                //取出了DataTable该怎么玩就怎么玩吧
            }
引用 17 楼 jjkk168 的回复:
Quote: 引用 14 楼 zz0834 的回复:
Quote: 引用 9 楼 starfd 的回复:

你可以向上面说的,先Fill到DataSet,然后对于DataSet你就可以循环处理了,因为DataTable本质上也是二维表格

能不能麻烦帮忙写个小代码学习一下,您这么直接说,我也不懂啊。

            string strSQL = "Select * from blah blah";
            using (SqlConnection conn = new SqlConnection("ConnectionString"))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(strSQL, conn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable();
                da.Fill(dt);

                //取出了DataTable该怎么玩就怎么玩吧
            }

那接下来的赋值怎么写?怎么把dt中的数据存入二维数组day1[10,8]

有没有人能写个全的,到底应该怎么实现?跪求,ORZ
既然已经在datatable里了,你循环datatable计算不就行了
dt.rows[i][j]就是代表第i行第j列的值

不要满脑子只有二维数组


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明sql数据库查询结果存入二维数组,结果都是0?求帮助
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!