这个 SQL 数据表有啥解决方法吗?

Posted

技术标签:

【中文标题】这个 SQL 数据表有啥解决方法吗?【英文标题】:Is there any workaround on this SQL Datatable?这个 SQL 数据表有什么解决方法吗? 【发布时间】:2021-09-02 11:25:07 【问题描述】:

我有这个运行良好的 CSharp WinForms 代码

            SqlConnection loginCon = new SqlConnection
                ("Data Source=MORTDECAI;Initial Catalog=d_Authentication;Integrated Security=True;Pooling=False;");
            SqlCommand connectionCommand = new SqlCommand
                ("Select * From d_Info where Username=@username COLLATE Latin1_General_CS_AS and Password=@password COLLATE Latin1_General_CS_AS", loginCon);

            connectionCommand.Parameters.AddWithValue("@username", textUsername.Text);
            connectionCommand.Parameters.AddWithValue("@password", textPassword.Text);

            connectionCommand.Connection = loginCon;
            loginCon.Open();
            SqlDataAdapter adaptData = new SqlDataAdapter(connectionCommand);
            DataSet databaseData = new DataSet();
            DataTable virtualTable = new DataTable();

            adaptData.Fill(databaseData, "Login");
            virtualTable = databaseData.Tables["Login"];

            loginCon.Close();
            int count = databaseData.Tables[0].Rows.Count;

            if (count == 1)
            
                if (virtualTable.Rows[0][1].ToString() == "Administrator")
                //some codes

注意最后一行:if (virtualTable.Rows[0][1].ToString() == "Administrator")

当在 C++/CLI 上应用相同的代码时,最后一行无法按预期工作。这是 C++/CLI 中的代码

        adaptData->Fill(dtbaseData, "AdminTable");
        dtTable = dtbaseData->Tables["AdminTable"];
        Database->Close();

        sqlCount = dtbaseData->Tables[0]->Rows->Count;
        if (sqlCount == 1) 
            if (dtTable->Rows[0][1]->ToString() == "Administrator") 
                this->Hide();
                res_load->Show();
            

我收到以下错误:

但是每当我从这样的代码中删除[1] 时都没有错误

有什么好的方法来处理这个错误吗?

问候,

乔伊

【问题讨论】:

不是 C++ 程序员,但Rows[0]->ItemArray[1](或Rows[0]->Item[1]?)有什么改变吗?我问是因为 DataRowCollection[0] 返回第一个 DataRow 然后在 C# 中调用 [1] 将使用默认索引器 Item 属性,但我真的不知道 C++ 是否支持默认索引器 @CaiusJard 是的,Item[1]表示给定行数据的sql列,其中第一行是[0] 所以它应该可以解决问题.. ? 我仍然需要调用存储数据的索引号 数据表有结果吗?我认为您没有从数据库中获取任何数据,这就是它失败的原因。检查您的连接字符串以确保它与工作代码匹配。您在工作和非工作示例中使用的是同一台机器吗? 【参考方案1】:

见here。根据那个帖子:

好像是IntelliSense的问题,不会停止程序的编译和执行。

虽然它似乎确实为您停止编译(也许我错了?)我相信解决方法可能仍然适用。

根据给出的链接,在您的情况下建议的解决方法是:

DataRow ^ row = dtTable->Rows[0];
if (row[1]->ToString() == "Administrator")

    this->Hide();
    res_low->Show();


【讨论】:

【参考方案2】:

我发现的另一个解决方法是这样做

                DataRow^ recAdmin = dtbaseData->Tables[0]->Rows[0];
                if (recAdmin->IsNull("AdminId")) 
                    throw gcnew IndexOutOfRangeException("No such Admin Exist!");
                 else
                    MessageBox::Show("Login succsessfull");
                    res_load->Show();
                    this->Hide();
                

As shown by the solution posted here

【讨论】:

以上是关于这个 SQL 数据表有啥解决方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

网页导出无法生成excel,有啥方法可以解决吗?

tornado v6 似乎已经放弃了 tornado.web.asynchronous 协程。在代码中解决这个问题有啥不同的方法吗?

将列表存储在数据库中的解决方法 - 有啥想法吗?

有啥方法或方法可以找出我的错误以获取此命令的解决方案吗?

startPreview 功能很慢,有啥解决方法吗?

SQL2005在附加数据库的时候出现无法打开物理文件,操作系统拒绝,这是怎么回事?有啥好的方法可以解决?