我正在尝试使用Powershell脚本执行对Oracle数据库的插入。这种方法适用于选择查询,但对于插入,它会产生错误。我阅读了很多Stack Overflow帖子和各种其他网站,并尝试了各种方法,但没有一个工作。
我该如何调试?我不是Powershell的专家。我很确定SQL存在一些问题。
Add-Type -Path "P:\Home\Full Oracle\ora11g_x86\odp.net\bin\2.x\Oracle.DataAccess.dll"
try
{
$compConStr = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=**)(PORT=1552)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=**)));User Id=**;Password=**;"
$oraConn= New-Object Oracle.DataAccess.Client.OracleConnection($compConStr)
$sid = "0001"
$region = "CH"
$timestamp = "2017-04-20 14:14:00"
$dep = "17-04-2017"
$scenario = "A"
$milestone = "ASB_XREF_GLCC_LOAD_2ND_END_E"
$finishtime = "2017-04-18/11:11"
$sql = "INSERT INTO APP_PDM_MART.PDM_GEAR_KPI_REP_SNOW(ST_ID,PRIORITY,STATUS,ACTIVE,ACTIVITY_DUE,ADD_REPORTED_BY,BUSINESS_CRITICALITY) VALUES($sid,$region,$timestamp,$dep,$scenario,$milestone,$finishtime)"
$oraConn.Open()
$command = New-Object Oracle.DataAccess.Client.OracleCommand($sql,$oraConn)
$tx = $oraConn.BeginTransaction()
$command.ExecuteNonQuery()
答案 0 :(得分:0)
我无法在查询中看到连接字符串。 $ oraConn 在哪里被创建。
我在考虑你确实有数据库细节。
$username = Read-Host -Prompt "Enter database username"
$password = Read-Host -Prompt "Enter database password"
$datasource = Read-Host -Prompt "Enter database TNS name"
$query = "INSERT INTO APP_PDM_MART.PDM_GEAR_KPI_REP_SNOW(ST_ID,PRIORITY,STATUS,ACTIVE,ACTIVITY_DUE,ADD_REPORTED_BY,BUSINESS_CRITICALITY) VALUES($sid,$region,$timestamp,$dep,$scenario,$milestone,$finishtime)"
$connectionString = 'User Id=' + $username + ';Password=' + $password + ';Data Source=' + $datasource
$connection = New-Object Oracle.ManagedDataAccess.Client.OracleConnection($connectionString)
$connection.open()
$command=$connection.CreateCommand()
$command.CommandText=$query
$reader=$command.ExecuteReader()
<#
while ($reader.Read()) {
$reader.GetString(1) + ', ' + $reader.GetString(0)
}
#>
$connection.Close()
你不必做while部分,这就是为什么我已经注释掉了。 请参阅博客以获取更多信息:Oracle Database Query From Powershell
如果仍有问题,请发布错误。 正如评论中提到的那样,您无法访问64位并且您只希望使用 Oracle.DataAccess.dll ,那么您可以尝试这样:
[Reflection.Assembly]::Assembly.LoadFrom("c:\Oracle\Oracle11gClientR1\ODP.NET\bin\2.x\Oracle.DataAccess.dll")
如评论中所述,使用Add-Type:
Add-Type -AssemblyName "c:\Oracle\Oracle11gClientR1\ODP.NET\bin\2.x\Oracle.DataAccess.dll"
然后我相信你应该能够像这样创建连接字符串:
$con = New-Object Oracle.ManagedDataAccess.Client.OracleConnection(“User Id=username;Password=password;Data Source=localhost/db1”)
$con.open()
希望它有所帮助。
答案 1 :(得分:0)
打印出正在执行的最终SQL查询我看到了这个 -
INSERT INTO APP_PDM_MART.PDM_GEAR_KPI_REP_SNOW (ST_ID, PRIORITY, STATUS, ACTIVE, ACTIVITY_DUE, ADD_REPORTED_BY, BUSINESS_CRITICALITY)
VALUES(0001, CH, 2017-04-20 14:14:00, 17-04-2017, A, ASB_XREF_GLCC_LOAD_2ND_END_E, 2017-04-18/11:11)
您需要正确插入日期时间属性。请参阅this。
答案 2 :(得分:0)
对我而言,服务器似乎不喜欢变量中的空格。如果没有为变量添加引号,它将不会像SQL语句中的连接字符串。尝试像这样定义变量:
{{1}}
所以例如 2017-04-20 14:14:00 将在INSERT语句中'2017-04-20 14:14:00'将明确服务器在哪里分隔值。
请记住,这会将所有变量作为字符串处理(我不知道表列的数据类型)。