kkpick 2021-12-01 19:31 采纳率: 100%
浏览 111
已结题

C# conn.open 链接SQL Server2008出错

问题遇到的现象:SQLServer2008链接数据库后并点击登录按钮后系统崩溃
代码如下

 using System;
using System.IO;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace SuperMarketMS
{
    /// <summary>
    /// 用途:用于直接与数据库进行交互
    /// </summary>
    public class DBHelper
    {
        //定义一个静态全局的数据库连接
        public static SqlConnection conn;

        //初始化数据库连接
        public static void GetConnection()
        {
            try
            {
                StreamReader sw = new StreamReader(Application.StartupPath + "\\DataSource.txt");
                string connString = sw.ReadToEnd();
                sw.Close();
                conn = new SqlConnection(connString);
            }
            catch
            {
                ;//DataSource.txt.不存在时
            }
        }

        #region  返回单行单列的值,用于登录验证
        public static int IsExecute(string sql)
        {
            int count = 0;
            conn.Open();
            SqlCommand cmd = new SqlCommand(sql, conn);
            count = Convert.ToInt32(cmd.ExecuteScalar());
            conn.Close();
            return count;
        }

        #endregion

        #region  执行增删改的方法
        public static int UserInsertDeleteUpdate(string sql)
        {
            int count = 0;
            conn.Open();
            SqlCommand cmd = new SqlCommand(sql, conn);
            count = Convert.ToInt32(cmd.ExecuteNonQuery());
            conn.Close();
            return count;
        }
        #endregion

        //------------------------------------------------------------------------
        public static DataSet ExecuteDataset(string cmdText, CommandType cmdType, string TableName, params SqlParameter[] cmdParms)
        {
            if (conn == null)
            {
                GetConnection();
            }
            SqlDataAdapter adapter = new SqlDataAdapter();
            SqlCommand cmd = new SqlCommand();
            adapter.SelectCommand = cmd;
            PrepareCommand(conn, cmd, cmdType, cmdText, cmdParms);
            DataSet ds = new DataSet();
            try
            {
                conn.Open();
                adapter.Fill(ds);
                conn.Close();
                cmd.Parameters.Clear();
                return ds;
            }
            catch (SqlException sqle)
            {
                throw new Exception(sqle.Message);
            }
        }

        //------------------------------------------------------------------------

        public static SqlDataReader ExecuteReader(string cmdText, CommandType cmdType, params SqlParameter[] cmdParms)
        {
            if (conn == null)
            {
                GetConnection();
            }
            SqlCommand cmd = new SqlCommand();
            PrepareCommand(conn, cmd, cmdType, cmdText, cmdParms);
            try
            {
                conn.Open();
                SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return reader;
            }
            catch (SqlException sqle)
            {
                throw new Exception(sqle.Message);
            }
        }
        //------------------------------------------------------------------------
        public static int ExecuteNonQuery(string cmdText, CommandType cmdType, params SqlParameter[] cmdParms)
        {
            if (conn == null)
            {
                GetConnection();
            }
            SqlCommand cmd = new SqlCommand();
            PrepareCommand(conn, cmd, cmdType, cmdText, cmdParms);
            try
            {
                conn.Open();
                int val = cmd.ExecuteNonQuery();
                conn.Close();
                cmd.Parameters.Clear();
                return val;
            }
            catch (SqlException sqle)
            {
                throw new Exception(sqle.Message);
            }
        }

        //------------------------------------------------------------------------
        public static object ExecuteScalar(string cmdText, CommandType cmdType, params SqlParameter[] cmdParms)
        {
            if (conn == null)
            {
                GetConnection();
            }
            SqlCommand cmd = new SqlCommand();
            PrepareCommand(conn, cmd, cmdType, cmdText, cmdParms);
            try
            {
                conn.Open();
                object val = cmd.ExecuteScalar();
                conn.Close();
                cmd.Parameters.Clear();
                return val;
            }
            catch (SqlException sqle)
            {
                throw new Exception(sqle.Message);
            }
        }

        //------------------------------------------------------------------------
        private static void PrepareCommand(SqlConnection conn, SqlCommand cmd, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
        {
            if (conn == null)
            {
                GetConnection();
            }
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            cmd.CommandType = cmdType;
            if (cmdParms != null)
            {
                foreach (SqlParameter parm in cmdParms)
                {
                    cmd.Parameters.Add(parm);
                }
            }
        }
    } 
}



运行结果及报错内容: 未处理NullReferenceException 未将对象引用设置到对象的实例。

  • 写回答

1条回答 默认 最新

  • CSDN专家-showbo 2021-12-02 09:43
    关注

    题主应该是没有将DataSource.txt这个文件放到winform项目的bin目录下的debug或者release【这2个目录取决于vs的编译配置,测试一般在debug下,release是发布的】目录下,就是要和编译后的exe文件要在同一个目录下,因为代码是通过读取这个文件获取数据库驱动的,由于GetConnection使用了try..catch,100%出现异常了,如文件不存在,或者文件中的驱动字符串有问题,如数据库名称,账户名,密码配置不对导致conn对象没有初始化为null,所以出现了NullReferenceException 错误

    将try..catch去掉

    
            //初始化数据库连接
            public static void GetConnection()
            {
               // try
                //{
                    StreamReader sw = new StreamReader(Application.StartupPath + "\\DataSource.txt");
                    string connString = sw.ReadToEnd();
                    sw.Close();
                    conn = new SqlConnection(connString);
                //}
                //catch
                //{
                    ;//DataSource.txt.不存在时
                //}
            }
    
    

    有帮助请【采纳该答案】,谢谢~~有其他问题可以继续交流~

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月11日
  • 已采纳回答 12月3日
  • 修改了问题 12月1日
  • 创建了问题 12月1日

悬赏问题

  • ¥15 请提供一个符合要求的网页链接。
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码