मैं डेटाबेस तालिका से मूल्यों को पढ़ने और तालिका में प्रिंट करने के लिए एक मूल प्रोग्राम लिख रहा हूं। तालिका एक प्राचीन कार्यक्रम द्वारा आबादी थी। पंक्ति में कुछ फ़ील्ड वैकल्पिक हैं और जब मैं उन्हें स्ट्रिंग के रूप में पढ़ने की कोशिश, मैं निम्नलिखित त्रुटि मिलती है:मैं डेटाबेस से शून्य वापसी मान कैसे संभाल सकता हूं?
panic: sql: Scan error on column index 2: unsupported driver -> Scan pair: <nil> -> *string
बाद मैं इसी तरह के मुद्दों के लिए अन्य प्रश्न पढ़ा है, मैं निम्नलिखित कोड को संभालने के लिए के साथ आया था शून्य मूल्य विधि अभ्यास में ठीक काम करता है। मुझे शून्य मानों के बजाय सादा पाठ और खाली स्ट्रिंग में मान मिलते हैं।
- यह कुशल नहीं लगती है:
हालांकि, मैं दो चिंताएं हैं। मुझे इस तरह के 25+ फ़ील्ड को संभालने की ज़रूरत है और इसका मतलब यह होगा कि मैं उनमें से प्रत्येक को बाइट्स के रूप में पढ़ता हूं और स्ट्रिंग में परिवर्तित करता हूं। बहुत अधिक फ़ंक्शन कॉल और रूपांतरण। डेटा को संभालने के लिए दो structs ...
- कोड बदसूरत लग रहा है। यह पहले से ही 2 फ़ील्ड के साथ घिरा हुआ दिख रहा है और मैं 25 +
पर जा रहा हूं, तो मैं इसे गलत कर रहा हूं? क्या डाटाबेस से मूल्य पढ़ने के लिए कोई बेहतर/क्लीनर/कुशल/मुहावराला गोलांग तरीका है?
मुझे यह विश्वास करना मुश्किल लगता है कि गो जैसे आधुनिक भाषा डेटाबेस रिटर्न को अच्छी तरह से संभाल नहीं पाएगी।
अग्रिम धन्यवाद!
कोड स्निपेट:
// DB read format
type udInfoBytes struct {
id []byte
state []byte
}
// output format
type udInfo struct {
id string
state string
}
func CToGoString(c []byte) string {
n := -1
for i, b := range c {
if b == 0 {
break
}
n = i
}
return string(c[:n+1])
}
func dbBytesToString(in udInfoBytes) udInfo {
var out udInfo
var s string
var t int
out.id = CToGoString(in.id)
out.state = stateName(in.state)
return out
}
func GetInfo(ud string) udInfo {
db := getFileHandle()
q := fmt.Sprintf("SELECT id,state FROM Mytable WHERE id='%s' ", ud)
rows, err := db.Query(q)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
ret := udInfo{}
r := udInfoBytes{}
for rows.Next() {
err := rows.Scan(&r.id, &r.state)
if err != nil {
log.Println(err)
}
break
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
ret = dbBytesToString(r)
defer db.Close()
return ret
}
संपादित करें:
मैं जहाँ मैं कोई शून्य से निपटने के बारे में चिंता और उन्हें स्वचालित रूप से के रूप में रिक्त स्ट्रिंग को पढ़ने के लिए निम्न कार्य की तरह कुछ करना चाहते हैं।
// output format
type udInfo struct {
id string
state string
}
func GetInfo(ud string) udInfo {
db := getFileHandle()
q := fmt.Sprintf("SELECT id,state FROM Mytable WHERE id='%s' ", ud)
rows, err := db.Query(q)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
r := udInfo{}
for rows.Next() {
err := rows.Scan(&r.id, &r.state)
if err != nil {
log.Println(err)
}
break
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
defer db.Close()
return r
}
उत्तर के लिए धन्यवाद। मैं देखता हूं कि अधिकांश समाधान sql.NullString या डेटाबेस विशिष्ट लाइब्रेरी का उपयोग करने का सुझाव देते हैं। मेरी इच्छा थी कि कुछ सामान्य था जो "डेटाबेस/एसक्यूएल" पर चलाएगा। उस समय के लिए मैं sql.NullString समाधान का उपयोग करूंगा क्योंकि मुझे ओडीबीसी (मुझे पता है, दर्दनाक) के माध्यम से एक दूरस्थ sqlserver डेटाबेस से कनेक्ट करना है। – FlowRaja