我打算写一个C#连接数据库登录的小程序,其他的功能都已经写好,就是在验证用户名和密码之后把本机的IP写入数据库,这个时候调试出现问题,提示数据库未初始化,改了半天也改不明白,求各位大牛帮忙看看,多谢
数据库结构如下:
数据库名:LoginDetail
UID------存放用户名
PWD------存放密码
IPaddr---存放IP地址
代码如下:
------------------------------------分割线--------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Net;
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
//获取本机IP,然后存储在strAddr中
public string getLocalIP()
{
string strHostName = Dns.GetHostName(); //得到本机的主机名
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName); //取得本机IP
string strAddr = ipEntry.AddressList[0].ToString();
return (strAddr);
}
private void button1_Click(object sender, EventArgs e)
{
string username;
string password;
string LocalIP;
string DBIP1 = "";
LocalIP = getLocalIP();
string dataDir = AppDomain.CurrentDomain.BaseDirectory;
if (dataDir.EndsWith(@"\bin\Debug\")
|| dataDir.EndsWith(@"\bin\Release\"))
{
dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
}
//定义用户名和密码变量
username = textBox1.Text;
password = textBox2.Text;
//使用创建数据库连接
using (SqlConnection conn = new SqlConnection(@"Data Source=数据库;Initial Catalog=xxx;User ID=数据库用户名;Password=密码"))
{
conn.Open();//打开数据库
//获取数据库中当前登录名的IP字段,存储与DBIP1中
using (SqlCommand getDBIP = conn.CreateCommand())
{
getDBIP.CommandText = "select * from LoginDetail where UID='" + username + "'";
using (SqlDataReader DBIP = getDBIP.ExecuteReader())
if (DBIP.Read())
{
DBIP1 = DBIP.GetString(DBIP.GetOrdinal("IPaddr"));
}
}
using (SqlCommand cmd = conn.CreateCommand())
{
//查询命令为:查询UserName等于输入的用户名
cmd.CommandText = "select * from LoginDetail where UID='" + username + "'";
//将查询到的数据保存在reader这个变量里
using (SqlDataReader reader = cmd.ExecuteReader())
{
//如果reader.Read()的结果不为空, 则说明输入的用户名存在
if (reader.Read())
{
/*从数据库里查询出和用户相对应的PassWorld的值
*reader.GetOrdinal("PassWord")的作用是得到PassWord的为这行数据中的第几列,返回回值是int
*reader.GetString()的作用是得到第几列的值,返回类型为String.
*/
string dbpassword = reader.GetString(reader.GetOrdinal("PWD"));
//比较用户输入的密码与从数据库中查询到的密码是否一至,如果一至,就登录成功
if (password == dbpassword)
{
if (DBIP1 == "")//如果数据库中当前登录的ID有记录IP地址,则拒绝登录
{
Form1 form1 = new Form1();
/*下面几句在调试的时候出现问题,提示“System.InvalidOperationException”类型的未经处理的异常在 System.Data.dll 中发生其他信息: ExecuteNonQuery: Connection property has not been initialized.我本来的意思是:如果登录成功,则把当前电脑的IP地址写入数据库中该用户名下面,当然,在该用户退出的时候我会在数据库中删除该IP,此处作用是限制一个用户在多处登录*/
string updatelocalIP = "update LoginDetail set IPaddr='" + LocalIP + "' where UID ='" + username + "'";
SqlCommand conn2 = new SqlCommand(updatelocalIP);
conn2.ExecuteNonQuery();
form1.Show();
conn.Close();
this.Visible = false;
}
else
{
MessageBox.Show("查询系统工号已在IP:" + DBIP1 + "上登录,请联系IT处理并修改密码", "登录异常");
}
}
else
{
//如果不相等,说明密码不对
MessageBox.Show("密码有误,请重新输入");
textBox2.Focus();
textBox2.SelectAll();
}
}
else
{
//说明输入的用户名不存在
MessageBox.Show("用户名不存在,请重新输入");
textBox1.Focus();
textBox1.SelectAll();
}
}
}
}
}
private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}
------解决思路----------------------
//这句错了 这句话没有关联SqlConnection 导致Command没有对应的连接来执行sql语句
SqlCommand conn2 = new SqlCommand(updatelocalIP);
------解决思路----------------------
SqlCommand conn2 = new SqlCommand(updatelocalIP);
改为:
SqlCommand conn2 = new SqlCommand(updatelocalIP,conn);