0

我很难理解为什么当我将一个项目添加到我的字符串数组“internalDives”时,该方法退出并且没有显示调试错误。

请问,我在这里做错了什么?

private void GridDataConnection()
{
    using (SqlCeConnection conn = new SqlCeConnection(ConnectionString))
    {
        conn.Open();

        using (SqlCeCommand command = new SqlCeCommand("SELECT id,divelocation,divedate,diveduration FROM loggeddives", conn))
        {
            SqlCeDataReader readDiveResult = command.ExecuteReader();

            var diveList = new List<string[]>();

            while (readDiveResult.Read())
            {
                string[] internalDives = new string[4];

                internalDives[0] = readDiveResult.GetString(0);
                internalDives[1] = readDiveResult.GetString(1);
                internalDives[2] = readDiveResult.GetString(2);
                internalDives[3] = readDiveResult.GetString(3);

                diveList.Add(internalDives);

                i++;
            }
        }

        conn.Close();
    }
}
4

4 回答 4

2

您确定所有列类型都是字符串吗?GetString 不进行任何转换,并假设所有列都是字符串类型。我建议您使用 try catch 语句来捕获任何 InvalidCastException.

还要检查所有值是否都被实例化。您可以使用 IsDBNull 方法来完成。

于 2012-07-24T19:46:08.477 回答
0

正如 mservidio 在评论中提到的那样,您应该做的第一件事绝对是捕获正在引发的异常。

当您这样做时,您很可能会发现您对 GetString 的调用之一引发了 IndexOutOfBoundsException,因此请准备好仔细检查您的代码并查看读取管道中的内容。它可能不是你想的那样。

于 2012-07-24T19:42:16.300 回答
0

我猜您的数据库中有空值,因此,当您尝试读取其中一列时,您会收到错误消息:“数据为空。无法在空值上调用此方法或属性”。您必须调用 IsDBNull 方法来检查该值是否为空,然后读取该值。

试试这个代码

private void GridDataConnection()
{
    using (SqlCeConnection conn = new SqlCeConnection(ConnectionString))
    {
        conn.Open();

        using (SqlCeCommand command = new SqlCeCommand("SELECT id,divelocation,divedate,diveduration FROM loggeddives", conn))
        {
            SqlCeDataReader readDiveResult = command.ExecuteReader();

            var diveList = new List<string[]>();

            while (readDiveResult.Read())
            {
                string[] internalDives = new string[4];

                internalDives[0] = readDiveResult.IsDBNull(0) ? "": readDiveResult.GetString(0);
                internalDives[1] = readDiveResult.IsDBNull(1) ? "": readDiveResult.GetString(1);
                internalDives[2] = readDiveResult.IsDBNull(2) ? "": readDiveResult.GetString(2);
                internalDives[3] = readDiveResult.IsDBNull(3) ? "": readDiveResult.GetString(3);

                diveList.Add(internalDives);

                i++;
            }
        }

        conn.Close();
    }
}
于 2012-07-24T19:42:59.670 回答
0

我通常会先验证从查询返回的信息,然后再尝试将其添加到数组或列表中。快速检查以验证所有值是否都是字符串,甚至可以通过计数来验证是否有 4 个值。正如其他人所提到的,try catch 非常有帮助。您还可以创建快速错误日志以将任何异常转储到临时文件中。

第一个回答要温柔!

于 2012-07-24T19:50:51.657 回答