一、配置文件格式
<connectionStrings>
<add name="Customers" connectionString="Data Source=191.168.5.210;Initial Catalog=xxxdb;User ID=sa;Pwd=123456;MultipleActiveResultSets=True"/>
</connectionStrings>
二、安装SQL SERVER 2014无法通过IP来远程访问
1、 我是在这里手动添加了一个默认端口号后解决了。
2.报此错误ServerVersion = “connection.ServerVersion”引发了类型“System.InvalidOperationException”的异常
查了半天,这个是防火墙的问题,把防火墙关了,或者把应用添加到允许中就好
在高级设置建立一条入站规则 ,将1433这个端口放行。
SQLSERVER通过防火墙详细设置https://www.cnblogs.com/jian1125/p/10640478.html
三、字段取值时提示“DBnull”异常
原因是数据库允许该字段为空,但是程序没有做定义或者是取值时没有做为空过滤,如下修正:
public int? LastModifierId { get; set; }//声明字段时加一个问号表示可空。
public T Find<T>(int id) where T : BaseModel
{
Type type = typeof(T);
string columnString = string.Join(",", type.GetProperties().Select(p => $"[{p.Name}]"));
string sql = $"select {columnString} From [{type.Name}] Where ID={id}";
Console.WriteLine(sql);
T t = (T)Activator.CreateInstance(type);//创建一个数据库实体
using (SqlConnection conn=new SqlConnection(StaticConstant.SqlServerConnString))
{
SqlCommand command = new SqlCommand(sql, conn);
conn.Open();
SqlDataReader reader=command.ExecuteReader();
if (reader.Read())//表示有数据 开始读
{
foreach(var prop in type.GetProperties())
{
prop.SetValue(t, reader[prop.Name] is DBNull?null:reader[prop.Name]);//如果为空,就返回一个空。这个非字符串字段在申明的时侯加上一个问号即可。
Console.WriteLine($"Name={reader[prop.Name]}");
}
}
}
return default(T);
}
四、封装好的读取数据库字段代码
using Chinasc.Framework;
using Chinasc.Libraries.Model;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Chinasc.Libraries.DAL
{
public class BaseDal
{
/// <summary>
/// 约束是为了正确的调用,才能int id
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="id"></param>
public T Find<T>(int id) where T : BaseModel
{
Type type = typeof(T);
string columnString = string.Join(",", type.GetProperties().Select(p => $"[{p.Name}]"));
string sql = $"select {columnString} From [{type.Name}] Where ID={id}";
T t = (T)Activator.CreateInstance(type);//创建一个数据库实体
using (SqlConnection conn=new SqlConnection(StaticConstant.SqlServerConnString))
{
SqlCommand command = new SqlCommand(sql, conn);
conn.Open();
SqlDataReader reader=command.ExecuteReader();
List<T> list = this.ReaderToList<T>(reader);
t = list.FirstOrDefault();//返回list中的第一个元素,如果序列中为null,就返回元素的默认值
}
return t;
}
public List<T> FindAll<T>() where T : BaseModel
{
Type type = typeof(T);
string columnString = string.Join(",", type.GetProperties().Select(p => $"[{p.Name}]"));
string sql = $"select {columnString} From [{type.Name}]";
List<T> list = new List<T>();
using (SqlConnection conn = new SqlConnection(StaticConstant.SqlServerConnString))
{
SqlCommand command = new SqlCommand(sql, conn);
conn.Open();
SqlDataReader reader = command.ExecuteReader();//执行数据库命令
list = this.ReaderToList<T>(reader); //
}
return list;
}
public List<T> ReaderToList<T>(SqlDataReader reader) where T:BaseModel
{
Type type = typeof(T);
List<T> list = new List<T>();
while (reader.Read())
{
T t = (T)Activator.CreateInstance(type);//创建一个数据库实体
foreach (var prop in type.GetProperties())
{
prop.SetValue(t, reader[prop.Name] is DBNull ? null : reader[prop.Name]);//如果为空,就返回一个空。这个非字符串字段在申明的时侯加上一个问号即可。
}
list.Add(t);
}
return list;
}
}
}