मैं .CSV फ़ाइल आयात करने के लिए PowerShell का उपयोग कर रहा हूं और मुझे इसकी सामग्री को डेटाबेस में सहेजने की आवश्यकता है।

मैं .CSV फ़ाइल से जानकारी निकालने के लिए नीचे दिए गए कोड का उपयोग कर रहा हूं, और इसे डेटाबेस में डाल रहा हूं

foreach($row in $data) {
    $sql = "INSERT INTO Offerings (RATING, PARVALUE, DESCRIPTION, COUPON, MATURITY, DATEDDATE, CALLDATE, FIRSTCOUPON, CUSIP, PRICEYIELD, COM) VALUES( `
    '$(($row.rating).trim())', `
    '$(($row."PAR VALUE").trim())',`
    '$(($row.DESCRIPTION).trim())', `
    '$(($row.COUPON).trim())', `
    '$(($row.MATURITY))', `
    '$(([datetime]$row."DATED DATE"))', `
    '$(($row."CALL DATE").trim())', `
    '$(($row."FIRST COUPON"))', `
    '$(($row.CUSIP).trim())', `
    '$(($row."PRICE/YIELD").trim())',`
    '$(($row.COM).trim())' `
    )"

    $command.CommandText = $sql
    $command.ExecuteNonQuery() | out-null
}

कॉलम $row.MATURITY/$row."CALL DATE" और $row."FIRST COUPON" सभी तिथियां हैं (डेटाबेस में कॉलम DATE प्रकार के हैं)।

लेकिन सम्मिलन इसे एक स्ट्रिंग के रूप में पास कर रहा है, जो डेटाबेस शिकायत करता है कि यह स्ट्रिंग को DATE में परिवर्तित नहीं कर सकता है। मैं इसे पावरशेल कमांड में एक तिथि के रूप में कैसे पास कर सकता हूं ताकि यह डेटाबेस में सही ढंग से लिखे (DATE प्रकार के रूप में)?

धन्यवाद!

0
ertuu85 8 मई 2018, 19:59

1 उत्तर

सबसे बढ़िया उत्तर

स्ट्रिंग concatenation एक बहुत बुरा विचार है। यह सिर्फ आपके कोड को SQL इंजेक्शन के लिए नहीं खोलता है, यह बेहद नाजुक है।

एक पैरामीटरयुक्त क्वेरी का उपयोग करें। मान लें कि आप SQL सर्वर का उपयोग कर रहे हैं:

$sql = "INSERT INTO Offerings (RATING, PARVALUE, DESCRIPTION, COUPON, MATURITY, DATEDDATE, CALLDATE, FIRSTCOUPON, CUSIP, PRICEYIELD, COM) " +
    "VALUES (@RATING, @PARVALUE, @DESCRIPTION, @COUPON, @MATURITY, @DATEDDATE, @CALLDATE, @FIRSTCOUPON, @CUSIP, @PRICEYIELD, @COM)"

$command.CommandText = $sql

# Add your parameters and define their types to match the types in the Offerings table
# The System.Data.SqlDbType type includes all SQL Server data types
# For data type mapping, see https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings
[void]$command.Parameters.Add('@RATING', [System.Data.SqlDbType]::NVarChar)
[void]$command.Parameters.Add('@PARVALUE', [System.Data.SqlDbType]::NVarChar)
[void]$command.Parameters.Add('@DESCRIPTION', [System.Data.SqlDbType]::NVarChar)
[void]$command.Parameters.Add('@COUPON', [System.Data.SqlDbType]::NVarChar)
[void]$command.Parameters.Add('@MATURITY', [System.Data.SqlDbType]::Date)
[void]$command.Parameters.Add('@DATEDDATE', [System.Data.SqlDbType]::Date)
[void]$command.Parameters.Add('@CALLDATE', [System.Data.SqlDbType]::Date)
[void]$command.Parameters.Add('@FIRSTCOUPON', [System.Data.SqlDbType]::NVarChar)
[void]$command.Parameters.Add('@CUSIP', [System.Data.SqlDbType]::NVarChar)
[void]$command.Parameters.Add('@PRICEYIELD', [System.Data.SqlDbType]::NVarChar)
[void]$command.Parameters.Add('@COM', [System.Data.SqlDbType]::NVarChar)
# I've defaulted to NVARCHAR here, but you should use the appropriate column data type

foreach ($row in $data) {
    # Set the values of each parameter
    $command.Parameters['@RATING'].Value      = $row.rating.trim()
    $command.Parameters['@PARVALUE'].Value    = $row."PAR VALUE".trim()
    $command.Parameters['@DESCRIPTION'].Value = $row.DESCRIPTION.trim()
    $command.Parameters['@COUPON'].Value      = $row.COUPON.trim()
    $command.Parameters['@MATURITY'].Value    = [datetime]$row.MATURITY
    $command.Parameters['@DATEDDATE'].Value   = [datetime]$row."DATED DATE"
    $command.Parameters['@CALLDATE'].Value    = [datetime]$row."CALL DATE"
    $command.Parameters['@FIRSTCOUPON'].Value = $row."FIRST COUPON"
    $command.Parameters['@CUSIP'].Value       = $row.CUSIP.trim()
    $command.Parameters['@PRICEYIELD'].Value  = $row."PRICE/YIELD".trim()
    $command.Parameters['@COM'].Value         = $row.COM.trim()

    [void]$command.ExecuteNonQuery()
}

यदि आप SQL सर्वर से भिन्न RDBMS का उपयोग कर रहे हैं तो आपका कोड थोड़ा भिन्न हो सकता है।

यदि आपको $row में स्ट्रिंग्स को डेटाटाइम्स में बदलने में समस्या हो रही है, तो आप ParseExact फ़ंक्शन का उपयोग कर सकते हैं:

$command.Parameters['@MATURITY'].Value    = [datetime]::ParseExact($row.MATURITY, 'dd.MM.yyyy', [cultureinfo]::InvariantCulture)

या आप Get-Date का उपयोग कर सकते हैं

$command.Parameters['@MATURITY'].Value    = Get-Date $row.MATURITY -Format 'dd.MM.yyyy'

पैरामीटरयुक्त प्रश्नों का एकमात्र जटिल हिस्सा यह है कि यदि आपको डेटाबेस में NULL को मान सेट करने की आवश्यकता है, तो पैरामीटर का मान [System.DBNull]::Value होना चाहिए, न कि $null

3
Bacon Bits 8 मई 2018, 21:35