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

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 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化