Kan jag få hjälp med den kod som krävs för att uppdatera den Exceldatabas som jag har i följande kod? Meningen är att koden ska ligga under "Button2". Att det ska vara så svårt. Jag har letat och letat. Jag har nu försökt med allt. Kan ni hjälpa mig? Det här är mitt första försök att skriva till en databas och det måste väl vara "en baggis" för er som varit med ett tag? Ola, Kan för lite för att fixa det själv. Kan man få hjälp med den koden? Det blir väl inte så många rader vad jag förstår? Ola, Jag har 2-3 böcker att läsa i men det hjälper inte om man kört fast. Ola, Ola, jag tror inte att du har genererat Update/Insert/Delete commands för din dataadapter. Ola, Hörrö varför har detta: har skrivit en liten excel-fil wrapper, och lade in som "Tips" här på pellesoft, som du kan kolla på: Rickard, Rickard, Rickard, Tack Rickard för hjälpen! Ola, OK Andreas, men jag skrev ju faktiskt 20 rader kod som fungerar. De 20 -30 rader som jag testat på olika sätt var ju fel och tillförde inget som jag ser det. Jag var heller inte säker på att felet inte låg i de rader som jag skickade med. För att vara första gången jag försökte göra detta så kändes det som en stor prestation. Tack för hjälpen ändå! Jag får det inte att fungera. Ola, Tack Andreas för att du vill hjälpa mig! Ola, Jag har bestämt för mig att Excel inte stödjer DELETE, dessutom. Så det kan vara läge att byta databas. Ja, Mikael En rekommendation är att köra mot sql. Du har MSDE ute som är gratis och snart kommer dessutom SQL 2005 Express, vilket man får hoppas blir gratis den med. Ola, Ola, Du bör ta en koll på mySQL, den fungerar bra för de flesta applikationer. Håller med. mySql är ett utmärkt alternativ som är gratis. Du kan använda Providern ByteFX för att programmera ADO.Net med Adaptrar, DataSet etc. precis som mot en Sql Server eller Oledb-datakälla. ByteFX kan man ladda ner från mySql's hemsida http://www.mysql.com eller så finns den med i Mono, som är OpenSource portningen av .Net Framework http://go-mono.com Gratis så länge man accepterar att licensiera sitt eget program under GPL (om man distribuerar det) och inte vill stödja utvecklingen av denna utmärkta programvara.Hur uppdaterar man en databas?
Koden läser ju först in allt som finns i tabellen [info$]. Informationen visas i DataGrid1. Där kan man ju manuellt ändra denna info och där efter vill jag kunna uppdatera databasen igen. Hur ska jag göra?
mvh Ola
Koden:
<code>
Dim Connection As String
Dim Sql As String = "SELECT * FROM [info$]"
Dim objDS As New DataSet
Private Sub Form1_Load() Handles MyBase.Load
End Sub
Private Sub Button1_Click() Handles Button1.Click
Connection = "Provider=Microsoft.Jet.OLEDB.4.0;"
Connection = Connection & "Data Source=C:\databas.xls;"
Connection = Connection & "Extended Properties=Excel 8.0;"
Dim objConn As New OleDb.OleDbConnection(Connection)
Dim objAdapter1 As New OleDb.OleDbDataAdapter(Sql, objConn)
objConn.Open()
objAdapter1.Fill(objDS, "resultat")
objConn.Close()
DataGrid1.DataSource = objDS.Tables("resultat")
End Sub
Private Sub DataGrid1_Navigate() Handles DataGrid1.Navigate
End Sub
Private Sub Button2_Click() Handles Button2.Click
'Här ska databasen uppdateras!
End Sub
End Class
</code>Sv: Hur uppdaterar man en databas?
Som koden ser ut nu fungerar allt fram tills det är dags att uppdatera databasen. Det händer ingenting. Inte ens ett felmeddelande.
Koden ser nu ut så här:
Imports System.Data.OleDb
Public Class Form1
Dim Sql As String = "SELECT * FROM [info$]"
Dim objDS As New DataSet
Dim Connection As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=C:\databas.xls;" & "Extended Properties=Excel 8.0;"
Dim objConn As New OleDb.OleDbConnection(Connection)
Dim objAdapter1 As New OleDb.OleDbDataAdapter(Sql, objConn)
Dim objTable As DataTable
Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Här Läses Data från Databasen
objConn.Open()
objDS.Clear()
objAdapter1.Fill(objDS, "resultat")
objConn.Close()
'Här lägger jag till info
objTable = objDS.Tables("resultat")
BindingContext(objDS, "resultat").Position = BindingContext(objDS, "resultat").Count - 1
Dim myRow As DataRow
myRow = objTable.NewRow()
myRow(0) = "pris"
myRow(1) = "0,21"
objTable.Rows.Add(myRow)
objDS.Tables("resultat").Rows(2).AcceptChanges()
'Och här försöker jag spara allt i databasen
objAdapter1.Update(objDS, "resultat")
End Sub
End ClassSv:Hur uppdaterar man en databas?
Bygg en vanlig <b>UPDATE</b> sql-sats, skapa ett <b>OldDbCommand</b> objekt som användet ditt querry. Sen anropar du <b>ExecuteNonQuery</b> metoden på ditt kommando.
Hoppas det löser sig!Sv: Hur uppdaterar man en databas?
mvh OlaSv:Hur uppdaterar man en databas?
Börja med att läsa igenom http://www.dotnetjunkies.com/quickstart/aspplus/doc/adoplusoverview.aspx för att få en intriduktion till ADO.NETSv: Hur uppdaterar man en databas?
//OlaSv:Hur uppdaterar man en databas?
Så din definition på att köra fast är att helt enkelt inte försöka? Det är så jag tolkar ditt svar när du ställer en fråga utan kod för den delen som du har problem med - det kan jag köpa, man vet inte alltid var man ska börja.
Sen svara jag med hänvisningar till vilka klasser som du skall använda, varpå du säger att du inte har tillräckliga kunskaper? Var blir nästa steg då? Jo att någon skall skriva koden till dig. Har du slått upp klasserna jag pekade dig till? Har du hittat på dem i dokumentationen och i dina 2-3 böcker? Jag är övertyga att tillsammans skall de ge dig tillräckligt mer information och exempel för att du skall kunna börja testa egen kod - funkar den koden inte sen så är det då lämpilgt att återvända med den koden här, varpå folk kan ge dig hjälp.
Snälla rätta mig om jag har fel?Sv:Hur uppdaterar man en databas?
Alltså du föder datasetet manuellt med data via kod utan att använda adapter.
Dataadaptern vet då inte hur den ska kunna uppdatera databasen, den kan ju inte gissa.
(Om du kommer ihåg gamla asp Recordset.Updatebatch det är samma koncept)
För att du ska kunna köra en Adapter.Update funktion, så måste dessa commands vara genererade.
Ofta görs det automatiskt beroende på HUR du använder dataadaptern, men ibland måste du
generera dessa själv.
Vad dataadapter egentligen gör i teorin är att synka sitt innehåll med en källa.
Har en datarow sin state satt till deleted,kommer ett deletesqlkommando genereras och utföras
vid .update tillfället. Samma sak med rowstate = new, eller modified.
Glöm ej heller för att kunna uppdatera och ta bort från en tabell rekommenderar jag att du har
ett id fält som är din primary key. tror att sqlcommanbuilder från lite problem annars.
Du ska använda ett objekt som heter: <b>SqlClient.SqlCommandBuilder</b>.
Sedan ska du låta denna commandbuilder bygga insert/update/delete åt dig.
Ungefär såhär:
<code>
'DA är din DataAdapter
Dim CmdBuild As New SqlClient.SqlCommandBuilder(DA)
DA.UpdateCommand = CmdBuild.GetUpdateCommand
'samma med insert/delete commands här.
'NU kommer förändrringarna kunna ske för nu vet DA hur den ska jobba.
DA.Update(DS, "testnamn")
</code>
med reservation för vissa fel, sitter inte med koden i huvudet, men det är det generella
tänket du borde förstå först.
MVH, RickardSv: Hur uppdaterar man en databas?
objDS.Tables("resultat").Rows(2).AcceptChanges()
detta säger ju åt raden att få rowstate = notchanged
Alltså - adaptern kommer inte vilja synka denna rad med datakällan,
eftersom den tror att ingen förändring skett.
Vet inte omdet är det som är felet, möjligt.Sv:Hur uppdaterar man en databas?
<url>http://www.pellesoft.se/communicate/tips/tips.aspx?tid=1934</url>Sv: Hur uppdaterar man en databas?
Anledningen till att inte använda CommandBuilder är så många så... precis på väg hem från jobb så jag hinner inte specificera en lista, men en googling borde ge lite resultat för den intresserade.Sv: Hur uppdaterar man en databas?
Anledningen till att inte använda CommandBuilder är så många så... precis på väg hem från jobb så jag hinner inte specificera en lista, men en googling borde ge lite resultat för den intresserade.Sv: Hur uppdaterar man en databas?
Anledningen till att inte använda CommandBuilder är så många så... precis på väg hem från jobb så jag hinner inte specificera en lista, men en googling borde ge lite resultat för den intresserade.Sv:Hur uppdaterar man en databas?
Jag ska testa när jag kommer hem (och familjen har somnat).
Andreas Håkansson
Jag vet inte hur många timmar jag har försökt få detta att fungera……
Och jag skulle inte ha försökt?? Varför är det så farligt att skriva ett par rader kod? Det kan jag inte förstå. Det kommer jag mer än gärna att göra om ett år eller två då jag kommer att kunna mycket mer än jag kan idag.
Mvh OlaSv: Hur uppdaterar man en databas?
Jag skriver gärna ett par rader kod när jag är övertygad om att personen verkligen har försökt, ta dig en titt i forumen så ska du se. Skriver till och med svar i både C# och VB.NET i samma trådar (ofta) om det är generella saker så som i ASP.NET Forumet.
Du visade kod, men inte den delen som visade att du var på gång med det som du ställde frågan om, inte heller någon som helst indikation på att hänvisningarna hade studerats och kunde ställa specifika frågor på det eller de moment som du inte riktigt fick rätt på - du bad om en hel lösning och det är jag inte intresserad av att ge direkt, dels för att med min svarsfrekevns så skulle jag få skriva hur mycket kod som helst på forumet, men även för att hjälpa.
Tänk på att prestationen skall ligga på dig och inte den som hjälper dig och det är därför att när man hjälper till på forumen så ser man gärna ett misslyckat försök, som man kan använda som en utgångspunkt, än en förfrågan på färdig kod.Sv:Hur uppdaterar man en databas?
mvh OlaSv: Hur uppdaterar man en databas?
Får leta upp ett fungerande exempel.
Kanske är det för att jag använder excel som databas och att något måste ställas in rätt i den filen.
//OlaSv:Hur uppdaterar man en databas?
Vad är det som händer när du försöker? Får du något fel? Klipp isf in felmeddelandet samt den kod som orsakar felet. Sv: Hur uppdaterar man en databas?
Så här ser det ut:
Jag har skapat en vanlig Excel fil. Sedan har jag lagt till kolumn namnen genom
”Insert/Name/Define”
Det finns tre kolumner med namnen ”id” i A1, ”Namn” i B1 och ”Köp” C1
Kolumn A har formatet ”Number”. B och C formatet ”Text”
Det finns info i cellerna A,B,C2 och A,B,C3
felmeddelande:
An unhandled exception of type 'System.InvalidOperationException' occurred in system.data.dll
Additional information: Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.
Koden:
Dim Sql As String = "SELECT * FROM [info$]"
Dim objDS As New DataSet
Dim Connection As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=C:\databas.xls;" & "Extended Properties=Excel 8.0;"
Dim objConn As New OleDb.OleDbConnection(Connection)
Dim objAdapter1 As New OleDb.OleDbDataAdapter(Sql, objConn)
Dim objTable As DataTable
Dim CmdBuild As New OleDb.OleDbCommandBuilder(objAdapter1)
Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Här Läses Data från Databasen
objDS.Clear()
objAdapter1.Fill(objDS, "resultat")
'Här lägger jag till info
objTable = objDS.Tables("resultat")
BindingContext(objDS, "resultat").Position = BindingContext(objDS, "resultat").Count - 1
Dim myRow As DataRow
myRow = objTable.NewRow()
myRow(0) = 2
myRow(1) = "bil"
myRow(2) = "200"
objTable.Rows.Add(myRow)
DataGrid1.SetDataBinding(objDS, "resultat")
MsgBox("hit fungerar det")
'Och här försöker jag spara allt i databasen
objAdapter1.UpdateCommand = CmdBuild.GetUpdateCommand
objAdapter1.Update(objDS, "resultat")
End SubSv:Hur uppdaterar man en databas?
Här är magin vi behövde!
<b>Additional information: Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.</b>
Eftersom du inte har någon kolumn som unikt kan identifera en rad, så vet heller inte ditt update kommando vilken/vilka rader den skall in och ändra i. Du behöver något som fungera på samma sätt som primärnykelfält gör i en databas tabell.
Jag skall precis gå utanför dörren, så jag hinner inte luska runt i excel just nu, men nu vet du vad du bör leta efter i excel (möjligheten att skapa en kolumn med unika värden) - annars får vi ta oss en titt senare när jag är hemma.Sv: Hur uppdaterar man en databas?
/mickeSv:Hur uppdaterar man en databas?
Tänkte jag skulle vara lite smart och använda Excel eftersom det är ett program som jag redan använt en hel del. Det verkar ju dock som om jag gjort ett misstag. Ska läsa på lite om Access istället.
Återkommer om jag löser kopplingen mot Excel.
Det är fritt fram för alla som kan bidra med något
mvh OlaSv: Hur uppdaterar man en databas?
Sv: Hur uppdaterar man en databas?
Ahh men Excel är ingen databas, det är ett kalkylprogram som det råkar finnas en ODBC provider för. Tanken är att man skall kunna använda det för automation, men det är inte på något sätt rekommonderatt att använda det som en datakälla, då är det minsta alternativer access - men som Hans säger så är MSDE ett bättre alternativ som är kostnadsfritt.Sv: Hur uppdaterar man en databas?
MSDE är en mindre version av SQL-Server, vilket innebär att du t.ex kan använda dig av Stored Procedure för prestanda, säkerhet och inkapsling av logik.
<b>Mer information om MSDE2000</b>
http://www.microsoft.com/sql/msde/default.asp
<b>Microsoft SQL Server 2000 Desktop Engine (MSDE 2000) version A</b>
http://www.microsoft.com/downloads/details.aspx?displaylang=sv&FamilyID=413744d1-a0bc-479f-bafa-e4b278eb9147Sv:Hur uppdaterar man en databas?
/JohanSv: Hur uppdaterar man en databas?
Sv:Hur uppdaterar man en databas?