C#重用我的接口访问数据库

C#重用我的接口访问数据库,c#,blazor,C#,Blazor,我对c#比较陌生,只是做了几年的开发人员。我遵循了这个非常棒的教程,学习了如何创建一个包含数据模型和接口的库,以处理检索数据和将数据插入数据库的操作。我正在开发Blazor服务器端应用程序。我利用我的数据访问库,通过startup.cs中创建的服务将其接口注入razor页面。所有这些都非常有效 但是,现在我正在创建一个类,该类读取分隔文件并将数据插入数据库表。我希望在我的数据访问库中使用与将razor页面连接到后端相同的接口 这里是我的类,我想使用IpermitData中的InsertPermi

我对c#比较陌生,只是做了几年的开发人员。我遵循了这个非常棒的教程,学习了如何创建一个包含数据模型和接口的库,以处理检索数据和将数据插入数据库的操作。我正在开发Blazor服务器端应用程序。我利用我的数据访问库,通过startup.cs中创建的服务将其接口注入razor页面。所有这些都非常有效

但是,现在我正在创建一个类,该类读取分隔文件并将数据插入数据库表。我希望在我的数据访问库中使用与将razor页面连接到后端相同的接口

这里是我的类,我想使用IpermitData中的InsertPermit方法将一条记录插入到我的数据库表中,但_db为null,当我运行它时会给我一个null引用异常。如何获取此接口的句柄,以便使用它插入数据

{
public class TextFileParser
{
    public TextFileParser()
    {

    }

    public void InsertTextFileData(string filePath)
    {
        string errMessage = string.Empty;
        FileInfo file = new FileInfo(filePath);
        if (!File.Exists(file.FullName))
        {
            errMessage = "File not found!";
        }
        else if (file.Length >= 0)
        {
            errMessage = "File has no data!";
        }

        IPermitData _db;

        PermitModel permitRecord = new PermitModel();
        string vText = string.Empty;
        string[] vString;
        string delimiter = "\t";
        StreamReader fileReader = new StreamReader(filePath);

        List<PermitModel> dt = new List<PermitModel>();
        //dt.Add("Parcel Number");
        //dt.Columns.Add("Permit ID");
        //dt.Columns.Add("Construction Loc");
        //dt.Columns.Add("Submission Date");
        //dt.Columns.Add("Issue Date");
        //dt.Columns.Add("Permit Type");
        //dt.Columns.Add("Const. Addr.");
        //dt.Columns.Add("EST Cost");
        //dt.Columns.Add("Referrer");
        //dt.Columns.Add("Comments");
        //dt.Columns.Add("Status");

        int header = 1;

        while (!fileReader.EndOfStream)
        {
            if (header == 1)
            {
                header += 1;
                vText = fileReader.ReadLine();
                vString = vText.Split(delimiter, StringSplitOptions.None);
                continue;
            }

            vText = fileReader.ReadLine();
            vString = vText.Split(delimiter, StringSplitOptions.None);
            permitRecord.PD_ParcelID = vString[0];
            permitRecord.PD_Situs1 = vString[1];
            permitRecord.PD_Owner = vString[2];
            permitRecord.PD_Addr1 = vString[3];
            permitRecord.PD_Addr2 = vString[4];
            permitRecord.ADDR_3 = vString[5];
            permitRecord.PD_City = vString[6];
            permitRecord.PD_State = vString[7];
            permitRecord.PD_Zip = vString[8];
            permitRecord.Type_Construction = vString[9];
            permitRecord.Estimated_Cost = vString[10];
            permitRecord.Permit_Issue_Date = vString[11];
            permitRecord.Permit_Type = vString[12];
            permitRecord.Property_Type = vString[13];
            permitRecord.Permit_NO = vString[14];
            permitRecord.Completion_Date = vString[15];
            permitRecord.Percent_Complete = vString[16];
            permitRecord.Modified_Date = vString[17];
            permitRecord.Note = vString[18];
            permitRecord.Note_Date = vString[19];
            permitRecord.Submission_Date = vString[20];
            permitRecord.Submitter = vString[21];
            permitRecord.Submitter_Phone = vString[22];
            permitRecord.Submitter_Email = vString[23];
            permitRecord.Land_AV = vString[24];
            permitRecord.Impr_AV = vString[25];
            permitRecord.Sec_Location = vString[26];



            try
            {
                _db.InsertPermit(permitRecord);

            }

            catch (Exception)
            {
                // dt.Add(vString[0], vString[14], vString[1], vString[20], vString[11], vString[12], vString[26], vString[10], vString[21], vString[18], "Failed " + ex.Message);
                //dt.Add(permitRecord);

                continue;
            }

            //dt.Rows.Add(vString[0], vString[14], vString[1], vString[20], vString[11], vString[12], vString[26], vString[10], vString[21], vString[18], "Passed");
        }

    }

}
{
公共类TextFileParser
{
公共TextFileParser()
{
}
public void InsertTextFileData(字符串文件路径)
{
string errMessage=string.Empty;
FileInfo file=新的FileInfo(filePath);
如果(!File.Exists(File.FullName))
{
errMessage=“未找到文件!”;
}
else if(file.Length>=0)
{
errMessage=“文件没有数据!”;
}
IPermitData_db;
PermitModel permitRecord=新PermitModel();
string vText=string.Empty;
字符串[]vString;
字符串分隔符=“\t”;
StreamReader fileReader=新的StreamReader(文件路径);
List dt=新列表();
//dt.添加(“包裹编号”);
//dt.列。添加(“许可证ID”);
//dt.栏添加(“施工位置”);
//dt.栏添加(“提交日期”);
//dt.栏添加(“发布日期”);
//dt.列。添加(“许可类型”);
//添加(“常量添加”);
//dt.列加上(“预计成本”);
//dt.列。添加(“推荐人”);
//dt.列。添加(“注释”);
//dt.列。添加(“状态”);
int头=1;
而(!fileReader.EndOfStream)
{
如果(标题==1)
{
标题+=1;
vText=fileReader.ReadLine();
vString=vText.Split(分隔符,StringSplitOptions.None);
继续;
}
vText=fileReader.ReadLine();
vString=vText.Split(分隔符,StringSplitOptions.None);
permitRecord.PD_ParcelID=vString[0];
permitRecord.PD_Situs1=vString[1];
permitRecord.PD_Owner=vString[2];
permitRecord.PD_Addr1=vString[3];
permitRecord.PD_Addr2=vString[4];
permitRecord.ADDR_3=vString[5];
permitRecord.PD_City=vString[6];
permitRecord.PD_State=vString[7];
permitRecord.PD_Zip=vString[8];
permitRecord.Type_构造=vString[9];
permitRecord.Estimated_Cost=vString[10];
permitRecord.Permit_Issue_Date=vString[11];
permitRecord.Permit_Type=vString[12];
permitRecord.Property_Type=vString[13];
permitRecord.Permit_NO=vString[14];
permitRecord.Completion_Date=vString[15];
permitRecord.Percent_Complete=vString[16];
permitRecord.Modified_Date=vString[17];
permitRecord.Note=vString[18];
permitRecord.Note_Date=vString[19];
permitRecord.Submission_Date=vString[20];
permitRecord.Submitter=vString[21];
permitRecord.Submitter_Phone=vString[22];
permitRecord.Submitter_Email=vString[23];
permitRecord.Land_AV=vString[24];
permitRecord.Impr_AV=vString[25];
permitRecord.Sec_Location=vString[26];
尝试
{
_db.插入许可证(许可证记录);
}
捕获(例外)
{
//dt.Add(vString[0]、vString[14]、vString[1]、vString[20]、vString[11]、vString[12]、vString[26]、vString[10]、vString[21]、vString[18]、“失败”+ex.Message);
//dt.添加(许可记录);
继续;
}
//添加(vString[0]、vString[14]、vString[1]、vString[20]、vString[11]、vString[12]、vString[26]、vString[10]、vString[21]、vString[18]、“已通过”);
}
}
}
}

以下是我的dataaccesslibrary中的代码文件

public interface IPermitData
{
    Task<List<PermitModel>> GetPermitData();
    Task InsertPermit(PermitModel permit);
    Task DeletePermit(PermitModel permit);
}

public class PermitData : IPermitData
{
    private readonly ISqlDataAccess _db;

    public PermitData(ISqlDataAccess db)
    {
        _db = db;
    }

    public Task<List<PermitModel>> GetPermitData()
    {
        string sql = "select * from dbo.I_Permit";

        return _db.LoadData<PermitModel, dynamic>(sql, new { });
    }

    public Task InsertPermit(PermitModel permit)
    {
        string sql = @"insert into dbo.I_Permit ( Parcel, Location, Owner_Name, ADDR_1, ADDR_2, ADDR_3, City, State_Sh, Zipcode, Type_Construction, Estimated_Cost, Permit_Issue_Date, Permit_Type, Property_Type, Permit_NO, Completion_Date, Percent_Complete, Modified_Date, Note, Note_Date, Submission_Date, Submitter, Submitter_Phone, Submitter_Email, Land_AV, Impr_AV, Sec_Location, PD_Owner, PD_Name2, PD_Addr1, PD_Addr2, PD_City, PD_State, PD_Zip, PD_ControlNo, PD_ParcelID, PD_Situs1, PD_Situs2, PD_S_City, PD_S_State, PS_S_Zip )
                     values ( @Parcel, @Location, @Owner_Name, @ADDR_1, @ADDR_2, @ADDR_3, @City, @State_Sh, @Zipcode, @Type_Construction, @Estimated_Cost, @Permit_Issue_Date, @Permit_Type, @Property_Type, @Permit_NO, @Completion_Date, @Percent_Complete, @Modified_Date, @Note, @Note_Date, @Submission_Date, @Submitter, @Submitter_Phone, @Submitter_Email, @Land_AV, @Impr_AV, @Sec_Location, @PD_Owner, @PD_Name2, @PD_Addr1, @PD_Addr2, @PD_City, @PD_State, @PD_Zip, @PD_ControlNo, @PD_ParcelID, @PD_Situs1, @PD_Situs2, @PD_S_City, @PD_S_State, @PS_S_Zip )";

        return _db.SaveData(sql, permit);
    }
    public Task DeletePermit(PermitModel permit)
    {
        string sql = @"DELETE FROM dbo.I_Permit WHERE Record_ID =' " + permit.Record_ID + " ';";

        return _db.DeleteData(sql, permit);

    }
}
public interface ISqlDataAccess
{
    string ConnectionStringName { get; set; }

    Task<List<T>> LoadData<T, U>(string sql, U parameters);
    Task SaveData<T>(string sql, T parameters);
    Task DeleteData<T>(string sql, T parameters);
}

public class SqlDataAccess : ISqlDataAccess
{
    private readonly IConfiguration _config;

    public string ConnectionStringName { get; set; } = "Default";


    public SqlDataAccess(IConfiguration config)
    {
        _config = config;
    }

    public async Task<List<T>> LoadData<T, U>(string sql, U parameters)
    {
        string connectionString = _config.GetConnectionString(ConnectionStringName);

        using (IDbConnection connection = new SqlConnection(connectionString))
        {
            var data = await connection.QueryAsync<T>(sql, parameters);

            return data.ToList();
        }
    }

    public async Task SaveData<T>(string sql, T parameters)
    {
        string connectionString = _config.GetConnectionString(ConnectionStringName);

        using (IDbConnection connection = new SqlConnection(connectionString))
        {
            await connection.ExecuteAsync(sql, parameters);
        }
    }

    public async Task DeleteData<T>(string sql, T parameters)
    {
        string connectionString = _config.GetConnectionString(ConnectionStringName);

        using (IDbConnection connection = new SqlConnection(connectionString))
        {
            await connection.ExecuteAsync(sql, parameters);
        }
    }
}
公共接口IPermitData
{
任务GetPermitData();
任务插入许可证(许可证模型许可证);
任务删除许可证(许可证模型许可证);
}
公共类许可数据:IPermitData
{
私有只读ISqlDataAccess_db;
公共许可数据(ISqlDataAccess数据库)
{
_db=db;
}
公共任务GetPermitData()
{
string sql=“select*from dbo.I_Permit”;
返回_db.LoadData(sql,新{});
}
公共任务插入许可证(许可证模型许可证)
{
字符串sql=@“插入到dbo.I_许可证中(地块、位置、业主名称、地址1、地址2、地址3、城市、州、邮编、类型施工、估计成本、许可证签发日期、许可证类型、财产类型、许可证编号、竣工日期、完工百分比、修改日期、注释、注记日期、提交日期、提交人、提交人电话、提交人电子邮件、土地影音、改进影音、Sec位置、PD业主、PD N)ame2、PD_地址1、PD_地址2、PD_城市、PD_州、PD_邮编、PD_控制编号、PD_地块、PD_地点1、PD_地点2、PD_城市、PD_州、PS_邮编)
价值观(@packet、@Location、@Owner\u Name、@ADDR\u 1、@ADDR\u 2、@ADDR\u 3、@City、@State\u Sh、@Zipcode、@Type\u Construction、@promission\u-Issue\u-Date、@promission\u-Type、@Property\u-Type、@promission\u-NO、@Completion\u-Date、@Modified\u-Date、@Note\u-Date、@Note\u-Date、@Submitter\u-Date、@Submitter\u-mail、@Land\u-AV、@Submitter\u-e、@Land\u-AV欧共体