【问题标题】:StreamReader null in classStreamReader 在类中为 null
【发布时间】:2013-08-08 03:19:05
【问题描述】:

我有这个在类中创建 SqlConnection 字符串的方法。我从 .txt 文件中读取数据,但问题是如果没有插入数据,应用程序甚至都不会打开。我想知道如何在消息框中引发异常并将该命令直接插入到此类方法中。我不确定这是否可能。对不起,如果我的回答太琐碎或毫无意义。好久没编程了。

internal static class DataSource
    {
        private static string _ConnectionString;
        public static string ConnectionString
        {
            get
            {
                if (_ConnectionString == null)
                    _ConnectionString = FunctionToDynamicallyCreateConnectionstring();
                return _ConnectionString;
            }
        }
 private static string FunctionToDynamicallyCreateConnectionstring()
        {

                string path = "C:\\Users\\marek\\Documents\\Visual Studio 2012\\Projects\\tours\\tours\\sql_string.txt";
                StreamReader sr = new StreamReader(File.Open(path, FileMode.Open));

                SqlConnectionStringBuilder cb = new SqlConnectionStringBuilder();

                cb.DataSource = sr.ReadLine();
                cb.InitialCatalog = sr.ReadLine();
                cb.UserID = sr.ReadLine();
                cb.Password = sr.ReadLine();
                return cb.ToString();

        }

【问题讨论】:

  • 现在你的问题是什么?
  • @user287107 我不知道如何在这个类中创建命令以向 MessageBox 中抛出异常,例如“没有输入连接字符串的信息”我希望我能描述我的问题正确,因为现在我每次有connection.Open或connection.Close命令时都必须尝试捕获。
  • 您可以使用Messagebox.Showthrow new ArgumentException("something");

标签: c# sql sql-server winforms


【解决方案1】:

当您的应用启动时使用 try/catch 封装对 DataSource.ConnectionString 的访问。下面是一些伪代码:

public void OnAppStart()
{
    string connString = null;
    try
    {
        connString = DataSource.ConnectionString;
    }
    catch (IOException ioe) 
    {
        MessageBox.Show("Hey, the file doesn't exist!");
    }
    catch (ArgumentNullException ane)
    {
        MessageBox.Show("Hey, the file is missing information!");
    }
    //You should be prepared to deal with a null or malformed connString 
    //from this point forwards
}

【讨论】:

  • 我真的不鼓励这样做。几乎每个 .NET 方法以及您将编写的方法都可能引发错误;尝试将所有内容包装在 try 块中将使您编写的代码量增加四倍。它使您的代码不可靠;当OnAppStart 退出时,您不知道DataSource.ConnectionString 是否有效;你在隐藏错误!例外是为了修复错误,而不是为了隐藏它们。
  • 假设DataSource.ConnectionString 对于应用程序的运行是必不可少的。如果应用程序可以在没有有效连接字符串的情况下运行,则应允许它继续运行,直到存在有效连接字符串。通过捕获访问ConnectionString 属性引发的异常,它允许您选择修复错误的时间和地点。我认为您误读了,因为我在OnAppStart 中发现了异常,而不是在DataSource.ConnectionString 的获取中
  • 虽然我不同意这种做法,但我承认它会起作用并且是提问者所要求的。如果您编辑问题,我将撤销我的反对票。
【解决方案2】:

我真的不鼓励“向 MessageBox 中抛出异常”,尤其是如果你只这样做的话。 处理错误例外,显示 MessageBox 不会处理错误。如果您无法处理错误,请停止。如果您只是显示一条消息并继续,当您尝试使用未获得的数据时,您将再次遇到相同的异常。那你打算怎么办?显示另一个 MessageBox?

是什么让您认为显示 MessageBox 会有所帮助?用户会知道如何修复它吗?如果代码是从服务或后台任务调用且没有 UI 怎么办?

如果你知道如何修复文件,你应该捕获异常,修复文件,然后重试。

编辑: 好的,如果你真的想“在这个类方法中”显示一个 MessageBox,试试这个:

private static string ReadConnectionstringFromFile(string path)
{
    try
    {
        using (var sr = new StreamReader(File.Open(path, FileMode.Open))
        {
            var cb = new SqlConnectionStringBuilder();
            cb.DataSource = sr.ReadLine();
            cb.InitialCatalog = sr.ReadLine();
            cb.UserID = sr.ReadLine();
            cb.Password = sr.ReadLine();
            return cb.ToString();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString(), ex.message);
        throw new CustomExceptionClassForYourApplication("Trying to get connection string from "
            + path, ex);
    }
}

【讨论】:

  • 谢谢你的回答,有没有办法把它扔进MessageBox?
  • 这只会在他尝试使用充满垃圾的连接字符串 (cb.DataSource = NonNullField(sr.ReadLine()) 实例化连接时导致另一个异常。这将导致丢失文件和实际无效连接字符串之间的歧义。我不确定这能解决什么问题。
  • @FlyingStrudel,请在评论前尝试建议;我的建议会抛出适当的错误,区分丢失的文件和丢失的内容,并禁止垃圾字段。是你的提议没有做这些;它会忽略错误,并且可以在ConnectionString 中静默填充空值,稍后在您尝试使用它时抛出神秘的 NullReferenceExceptions。
  • @DourHighArch 它不会忽略错误,如果文件不存在则_ConnectionString 保持为空,强制ConnectionString 的下一次访问再次检查文件。你永远不会得到一个空连接字符串,你只会得到一个值或异常。
猜你喜欢
  • 1970-01-01
  • 2020-03-26
  • 2014-10-08
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
相关资源
最近更新 更多