【问题标题】:C# SQL SERVER - Cannot convert nvarchar to text?C# SQL SERVER - 无法将 nvarchar 转换为文本?
【发布时间】:2019-11-29 21:52:47
【问题描述】:

我正在处理的一个大型项目存在问题。我以前从未遇到过这个问题,但它今天开始发生。有什么修复吗?

error: System.Data.SqlClient.SqlException: '数据类型 text 和 nvarchar 在等于运算符中不兼容。'

我不明白它是什么意思。我不想进行 sql 注入,所以我正在使用参数。但它仍然会出错。

如果您需要我描述一些事情,请问我...这就像我的第 5 篇文章。


            using (SqlCommand StrQuer = new SqlCommand("SELECT * FROM login WHERE username=@userid AND password=@password", connection))
            {
                StrQuer.Parameters.AddWithValue("@userid", username.Text.ToLower().Trim());
                StrQuer.Parameters.AddWithValue("@password", obf.Obfuscate(password.Text).ToString());
                SqlDataReader dr = StrQuer.ExecuteReader();
                if (dr.HasRows)
                {
                    Properties.Settings.Default.username = username.Text.ToLower();
                    Properties.Settings.Default.username = obf.Obfuscate(password.Text);
                    RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\howcoolitisX");
                    key.SetValue("username", username.Text.ToLower());
                    key.SetValue("password", obf.Obfuscate(password.Text));
                    key.Close();
                    Form executor = new Loader();
                    executor.Show();
                    this.Hide();
                }
            }

【问题讨论】:

  • 忘了说!混淆函数只是做一个base64混淆cs class Obfuscation { public string Obfuscate(string source) { return Convert.ToBase64String(Encoding.UTF8.GetBytes(source)).ToString(); }
  • text 数据类型不适用于密码,您应该将其更改为 nvarchar。顺便说一句,base64 编码不提供任何安全性。
  • 我知道。 Base64 解码器已上线。这不是我担心的。我担心 sql 不能在 atm 工作。但是你的意思是把它改成nvarchar,代码还是数据库?
  • 我的意思是数据库。
  • Properties.Settings.Default.username = obf.Obfuscate(password.Text); ???错字?还是强制用户将用户名设置为密码?

标签: c# sql winforms


【解决方案1】:

好吧,首先我想说你应该看看如何存储密码securely

至于手头的问题有多种解决方案

  1. castSQL 中的参数之一
new SqlCommand("SELECT * FROM login WHERE username= CAST(@userid as text) AND password= CAST(@@passwordas text)", connection)
  1. 或者使用Parameters.Add instead of Parameters.AddWithValue并显式设置参数type
StrQuer.Parameters.Add("@userid", SqlDbType.Text);
command.Parameters["@userid"].Value = username.Text.ToLower().Trim();
  1. 或者,如果您可以轻松更改数据库,那么请务必按照Crowcoder 的建议进行操作,并将列更改为nvarchar,因为textobsolete 数据类型

重要!在 SQL Server 的未来版本中将删除 ntext、text 和 image 数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用 nvarchar(max)、varchar(max) 和 varbinary(max)。

【讨论】:

  • 我喜欢这个选项:更改为“Parameters.Add(parameter, SqlDbType)”+1
  • 是的,谢谢。我不是在寻找安全地存储它们,因为在这个 get 发布之前还会发生其他事情,c# 代码本身会被混淆所以是的。
猜你喜欢
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 2017-02-09
  • 2022-01-19
  • 2014-05-07
  • 1970-01-01
相关资源
最近更新 更多