我尝试用 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#做了一个winform程序,如何把整个程序嵌入到网页中运行?急!
C# Winforms - 尝试通过将 FileDialogPermission 添加到 AppDomainSetup 来显示 OpenFileDialog
C# winform 程序 怎么动态设置BackgroundImage属性。这个图片的类型是啥 如果用代码编写我该怎么写