我尝试用 c# (winforms) 在 oracle 数据库中写一些东西,我只能让 SELECT 语句工作,而不是 INSERT 语句

Posted

技术标签:

【中文标题】我尝试用 c# (winforms) 在 oracle 数据库中写一些东西,我只能让 SELECT 语句工作,而不是 INSERT 语句【英文标题】:I try to write something in a oracle database with c# (winforms) and I can only get the SELECT Statement to work, not the INSERT Statement 【发布时间】:2020-07-12 14:29:53 【问题描述】:

我编写了以下代码,用于使用我的 c# 代码连接到 oracle 数据库:

private string GenerateConnectionString()

    return "Data Source=( DESCRIPTION = ( ADDRESS_LIST = ( ADDRESS = ( PROTOCOL = TCP )( HOST = 192.168.X.XXX)( PORT = 1521 ) ) )( CONNECT_DATA = ( SERVER = DEDICATED )( SERVICE_NAME = XXXX ) ) ); User Id= xxxxxx; Password = xxxxxx;";


private void button1_Click_1(object sender, EventArgs e)

    try
    
        using (OracleConnection connection = new OracleConnection(GenerateConnectionString()))
        
            connection.Open();
            lblState.Text = connection.State.ToString();
            OracleCommand oc = connection.CreateCommand();
            oc.CommandText = "INSERT INTO TABLE (NO1, NO2, NO3, NO4, NO5, NO6, NO7, NO8, NO9, NO10, NO11, NO12, DATE) VALUES(1,2,3,1,1,1,'txb_Textbox1.Text',5,0.5,10,11,12,TO_DATE('09.07.2020 16:24:00', 'DD.MM.YYYY HH24:MI:SS'))";
            oc.ExecuteNonQuery();
         
        
    
    catch (Exception ex)
    
        MessageBox.Show( "Exception: " + ex.Message );
        lblState.Text = ex.Message;
    

我还安装了连接到 oracle 数据库所需的所有驱动程序,并添加了 System.Data.OracleClient.dll 作为对我的 c# 项目的引用,并将“oraocci19.dll”和“oraocci19d.dll”文件添加到项目文件。我还将oracle客户端添加到PATH下的系统环境变量中。此外,我在整个代码的开头声明了using System.Data.OracleClient;

请不要告诉我我不使用最新的 Oracle 数据访问组件 (ODAC)。我知道。我们有一个非常旧的 Oracle 数据库,我喜欢我只需要安装几个 oracle dll 就可以工作的想法。

我只是不知道该做什么,整个星期五和整个周末都在研究,以便我可以写入 Oracle 数据库。我希望有经验的人直接认识到这个问题并可以帮助我。 非常感谢您! :) 最好的问候

Edit1:也许我应该尝试其他 Oracle 数据访问组件 (ODAC) 及其 dll。但通常我的 dll 文件也应该可以工作。我的一位同事使用了我的 ODAC 安装,他说一切都可以使用。但是,他只需要从 Oracle 表中读取数据,而不是写入。

Edit2:我遇到了问题!我能够找到解决方案。他们是我在字符串中的 Oracle 提示中的一个错误。 C# 代码是正确的。在 *** 上,我当然重新制定和概括了 Oracle 提示字符串,因为它包含受信任的数据。错误出现在 Oracle 命令中。该线程可以关闭。 Pete -S- 得到了正确答案!

【问题讨论】:

你遇到了什么错误? 也许你需要在执行命令之前放入INSERT语句? :-) @ChetanRanpariya:我在控制台的 System.Data.OracleClient.dll 中得到“System.InvalidOperationException”。和例外:未设置“CommandText”属性。但我没有在命令文本中看到错误。如果我在 NaviCat 中使用相同的命令文本,我可以在 oracle 数据库中写入。同样在 C# 代码中,我应该传递字符串,就好像我将查询输入到 NaviCat 之类的数据库程序中一样。 旁注,如果 txb_Textbox1 旨在插入文本框的上下文,它将不起作用。您需要 txb_Textbox1.Text 代替。但是,将用户键入的字符串插入另一个用于执行 sql 命令的字符串中是一个众所周知的安全漏洞,称为 Sql Injection。您应该为此使用参数。 第二个命令有效,因为它是由 ExecuteReader 执行的,第一个命令无效,因为您在调用 ExecuteNonQuery 之后设置了它 【参考方案1】:

你可以试试这个:

//Do the insert
 oc.CommandText = "INSERT INTO TABLE (NO1, NO2, NO3, NO4, NO5, NO6, NO7, NO8, NO9, NO10, NO11, NO12, DATE) VALUES(1,2,3,1,1,1,'txb_Textbox1',5,0.5,10,11,12,TO_DATE('09.07.2020 16:24:00', 'DD.MM.YYYY HH24:MI:SS'))";
oc.ExecuteNonQuery;

//Retrieve in a separate action (you have to update your command to SELECT from INSERT)
oc.CommandText = "SELECT * FROM TABLE"; Statement
OracleDataReader reader = oc.ExecuteReader();
            

您可以查看的另一件事是CommandBuilder;但是,这是一个简单的方法,然后是一个很好的解决方案。然后您可以指定 SELECT,命令生成器将创建 INSERT、UPDATE 和 DELETE 命令。

其他想法 我认为您不能将数据阅读器绑定到.DataSource。您可以从数据读取器加载数据表,请参阅this example。

这里有更多关于DataAdapters and DataReaders的信息

要更新/插入:使用 .ExecuteNonQuery 到 SELECT:有不同的选择,一种是通过 DataAdapaters 构建一个DataTable 并使用数据表绑定数据源。

【讨论】:

谢谢,但如果我使用“从表中选择 *”,我可以将所有值放入 dataGrid。问题是“INSERT”不起作用,我已经使用了 .ExecuteNonQuery 方法。 您应该将 INSERT 和 SELECT 分开。这是两种不同的数据库操作。您可以使用相同的代码方法插入和选择。 通常,我会有一个方法来执行 INSERT、处理异常,然后是一个单独的方法来返回数据,因为您不想将数据库代码与用户界面混合(分离)。 我知道我必须拆分它:) 我只是在示例代码中留下了“SELECT”查询的代码,因为我想说,SELECT 有效,但 INSERT 无效。最后,我只需要让 INSERT 在我的代码中工作。我使用 SELECT 来检查与数据库的连接是否有效,即我的 c# 代码中的连接字符串是否正确。我现在正在编辑我的示例代码。 我认为试图用一件令人困惑的事情来做这个例子。我更新的代码示例对您有用吗?我想要了解的是 INSERTS 和 UPDATES 正在使用一种方法执行,而 SELECT 使用另一种方法。【参考方案2】:

你的操作顺序不对,需要先设置命令文本再执行命令(用ExecuteNonQuery()ExecuteReader()):

 OracleCommand oc = connection.CreateCommand();
 oc.CommandText = "INSERT INTO TABLE (NO1, NO2, NO3, NO4, NO5, NO6, NO7, NO8, NO9, NO10, NO11, NO12, DATE) VALUES(1,2,3,1,1,1,'txb_Textbox1',5,0.5,10,11,12,TO_DATE('09.07.2020 16:24:00', 'DD.MM.YYYY HH24:MI:SS'))";
 OracleDataReader reader = oc.ExecuteReader();

【讨论】:

以上是关于我尝试用 c# (winforms) 在 oracle 数据库中写一些东西,我只能让 SELECT 语句工作,而不是 INSERT 语句的主要内容,如果未能解决你的问题,请参考以下文章

C# WinForms 用鼠标拖动控件

c#中winform是用啥语言编写?

我现在用C#做了一个winform程序,如何把整个程序嵌入到网页中运行?急!

C# Winforms - 尝试通过将 FileDialogPermission 添加到 AppDomainSetup 来显示 OpenFileDialog

C# winform 程序 怎么动态设置BackgroundImage属性。这个图片的类型是啥 如果用代码编写我该怎么写

C# WinForms DragEnter 从不触发