C#-使用SQL Server存储过程连接到数据库并插入数据

时间:2018-10-02 13:11:03

标签: c# unit-testing database-connection

我正在尝试教自己一些C#(如果可以告诉您任何信息,它在90年代后期用于C ++编程)。因此,无论如何,当尝试测试我的一个类时,我一直在Visual Studio 2017中遇到测试失败。

设置如下:

enter image description here

在我的ErrorLog.cs文件中:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dapper;
using System.Configuration;

namespace ManagementLibrary {
    public class ErrorLog {
        private int log_id { get; set; }
        private string logException {get; set;}
        private string error { get; set; }
        private string date_time { get; set; }
        private string logObject { get; set; }

        public ErrorLog(string logException, string error, string date_time, string logObject) {
            this.logException = logException;
            this.error = error;
            this.date_time = date_time;
            this.logObject = logObject;
        }

        public int LogError() {
            using (SqlConnection connection = new System.Data.SqlClient.SqlConnection(Helper.CnnVal("DataConnection"))) {

                SqlCommand command = new SqlCommand("InsertErrorLog", connection);
                command.CommandType = CommandType.StoredProcedure;

                SqlParameter p1 = new SqlParameter();
                p1.ParameterName = "@Exception";
                p1.SqlDbType = SqlDbType.VarChar;
                p1.Direction = ParameterDirection.Input;
                p1.Value = this.logException;

                SqlParameter p2 = new SqlParameter();
                p2.ParameterName = "@Error";
                p2.SqlDbType = SqlDbType.VarChar;
                p2.Direction = ParameterDirection.Input;
                p2.Value = this.error;

                SqlParameter p3 = new SqlParameter();
                p3.ParameterName = "@DateTime";
                p3.SqlDbType = SqlDbType.VarChar;
                p3.Direction = ParameterDirection.Input;
                p3.Value = this.date_time;

                SqlParameter p4 = new SqlParameter();
                p4.ParameterName = "@logObject";
                p4.SqlDbType = SqlDbType.VarChar;
                p4.Direction = ParameterDirection.Input;
                p4.Value = this.logObject;

                command.Parameters.Add(p1);
                command.Parameters.Add(p2);
                command.Parameters.Add(p3);
                command.Parameters.Add(p4);

                connection.Open();
                var identity = command.ExecuteNonQuery();
                return identity;
            }

        }

    }
}

基本上,我试图为遇到错误时创建审核跟踪创建一个简单的记录到数据库。因此,我不仅试图自学一些C#,而且还试图学习如何在Visual Studio中进行单元测试。我已经遵循了一些有关设置和进行单元测试的教程,但是当我这样做时,总是遇到以下失败:

  

消息:测试方法   ManagementLibrary.Tests.ErrorLogTests.LogErrorTest引发异常:   System.NullReferenceException:对象引用未设置为实例   一个对象。

当我“调试”失败时,它“进入”我的Helper.cs文件。现在,此类仅读取App.config文件并返回连接字符串。

namespace ManagementLibrary {
    public static class Helper {
        public static string CnnVal(string name) {
            return ConfigurationManager.ConnectionStrings[name].ConnectionString;
        }
    }
}

并显示错误:“对象引用未设置为对象的实例”。

我什至不知道这意味着什么。

有想法吗?

1 个答案:

答案 0 :(得分:1)

使用ConfigurationManager时,它将读取条目程序集/项目的app.config。因此,在这种情况下,当您运行单元测试时,该条目是没有app.config的测试项目。因此,每次尝试使用ConfigurationManager时都会出错。