【问题标题】:C# SQL Select a data from tableC# SQL 从表中选择数据
【发布时间】:2017-10-06 15:49:28
【问题描述】:

我有一个数据库(用户名(键),全名,密码),我想搜索用户名并在控制台中写出该用户名的全名。 我有这些:

static DataTable dt = new DataTable();
static SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=""path\login.mdf"";Integrated Security=True");

con.Open();
string username="mate";
    SqlDataAdapter sda = new SqlDataAdapter("SELECT Nev FROM Login WHERE username='" + username+ "'", con);
        sda.Fill(dt);
        string fullname;
        if (dt.Rows[0][0].ToString() == "1")then?

“Nev”表示全名

我希望它把全名写入“全名”字符串,然后:

Console.Writeline("Welcome {0}",fullname);

你能帮我写这段代码吗?
我只是不知道如何继续我的代码。用户可以登录并注册到应用程序,当他们登录时,我想在他们注册用户名时像“Hello FullName”一样问候他们,存储全名和密码,并使用用户名和密码登录。如果我知道用户名,我只是不知道如何找到全名。 (我是 SQL 初学者)

【问题讨论】:

  • 您似乎没有打开连接。
  • 刚刚漏了一行,有一个 con.open @chaosifier
  • 为什么要使用 DataAdapter?您只想获得一个用户名,是吗?然后使用ExecuteScalar(它会直接返回你需要的字符串,而且速度快很多)
  • 你不应该像这样连接一个 SQL 语句,特别是如果你连接的值(用户名)来自用户输入,它会让你对 SQL 注入开放。你应该使用参数。如果您正在寻找一个不同的值,您可以使用 ExecteScalar。 SO上有很多这样的例子
  • 一个例子:stackoverflow.com/questions/542510/…。如果没有参数,有人可能会删除您的所有数据、删除用户、删除数据库,甚至更糟

标签: c# sql database


【解决方案1】:

我想这就是你所追求的:

string fullname = null;
using(var con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=""path\login.mdf"";Integrated Security=True")) {
    string username = "mate";
    SqlCommand cmd = new SqlCommand("SELECT Nev FROM Login WHERE username=@Username", con);
    cmd.Parameters.AddWithValue("@Username", username);

    con.open();
    fullname = cmd.ExecuteScalar()?.ToString();
}

if (fullname == null) {
    Console.WriteLine("The username could not be found!");
}

using 确保在退出块后清除连接。此外,您应该使用Parameters 来更好地抵御 SQL 注入。

【讨论】:

  • System.TypeInitializationException 未处理 消息:mscorlib.dll 中发生“System.TypeInitializationException”类型的未处理异常 - 应用程序进入中断模式”
  • 您确定您的连接字符串 ("Data Source=(LocalDB)..." 正确吗?
  • 现在是。但仍然“对象引用未设置为任何对象实例。”
  • @Skickpause 你确定你的数据库中有一个用户名'mate'吗?对我来说,听起来查询没有返回任何结果,所以 cmd.ExecuteScalar() 返回 null。
  • 是的。你真棒:D
【解决方案2】:

针对您的具体问题,请尝试以下代码:

if(dt.Rows.Count > 0)
      fullname = dt.Rows[0]["Nev"].ToString();

但这里有一个更好、更完整的解决方案:

string userName = "mate";
string fullName = string.Empty;

string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=path\login.mdf;Initial Catalog=Login;Integrated Security=True";
string query = "SELECT Nev FROM Login WHERE username=@UserName;";

using (SqlConnection connection = new SqlConnection(connectionString))
{
     SqlCommand command = new SqlCommand(query, connection);
     command.Parameters.Add("@UserName", SqlDbType.NVarChar);
     command.Parameters["@UserName"].Value = userName;

     try
     {
         connection.Open();
         fullName = command.ExecuteScalar().ToString();
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.Message);
     }
}

Console.WriteLine("Hello {0}!", fullName);

【讨论】:

  • 对象引用未设置为任何对象实例。 “你好!”
  • 你用了什么连接字符串?您似乎一直在使用不正确的连接字符串。
  • 不,不能错。我检查了一千次​​pan>
  • 你确定表中有数据吗?
  • imgur.com/a/qfDtL 我 1000% 确定。或者数据库在另一个项目的文件夹中是否有问题?但是连接字符串是正确的
猜你喜欢
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多