webForumDet fria alternativet

Lång insert

.NET

11 svar · 418 visningar · startad av aleborg

Medlem sedan jan. 20013 341 inlägg
Frågan#1

Jag har ett formulär som innehåller ca 88 st textfält, det skulle bli en grymt lång insert-sats, kan man på nått sätt göra en loop och trycka in allt? textfälten har samma namn som databasfälten...

Medlem sedan dec. 19991 072 inlägg
#2

Ja...det bör väl inte vara spec. lurigt....

Använder du SQL-server och en SP?

I så fall kan du göra så här typ:

1. Skapa ett command-objekt mot din SP
2. Loopa igenom alla dina kontroller
3. Kontrollera aktuellt kontrolls-namn och jämför mot ditt command-objekt om namnet finns med som en parameter
4. Finns det med så lägg med parametern med aktuellt namn och värde
5. Kör din SP.

På detta sätt kan du även ha med kontroller som inte finns i databasen.

Kör du inte med SP få du loopa igenom kontrollerna och helt enkelt anta att alla ska vara med, och då skapa SQL-strängen manuellt.

        Dim Ctrl As Control
        Dim sb As New System.Text.StringBuilder("INSERT INTO Tbl (")
        For Each Ctrl In Me.Controls
            If TypeOf Ctrl Is TextBox Then
                sb.Append(Ctrl.Name)
                sb.Append(",")
            End If
        Next
        sb.Remove(sb.Length - 1, 1)
        sb.Append(") VALUES (")
        For Each Ctrl In Me.Controls
            If TypeOf Ctrl Is TextBox Then
                sb.Append("'")
                sb.Append(Ctrl.Text)
                sb.Append("',")
            End If
        Next
        sb.Remove(sb.Length - 1, 1)
        sb.Append(")")

Går även att göra bättre...men du ser mönstret iaf...

Medlem sedan jan. 20013 341 inlägg
#3

Kör C# och MySQL :D

Medlem sedan dec. 19991 072 inlägg
#4

Ok...ja då får det bli alternativ 2 då....

Du ser säkert från min VB kod hur det ser ut...

...annars kan säkert nån annan översätta...det är väldigt simpel kod...

Medlem sedan jan. 20013 341 inlägg
#5

Hmmm, får inte riktigt ihop det

StringBuilder sb = new StringBuilder("Insert Into reseller_contacts (");
foreach(Control Ctrl in this.Controls)
{
	if(Ctrl.GetType()==TextBox)
		sb.Append(Ctrl.NamingContainer+",");
}

Ctrl.Name finns inte och 'System.Web.UI.HtmlControls.HtmlInputText' denotes a 'class' where a 'variable' was expected

Medlem sedan jan. 20013 341 inlägg
#6

Här är koden jag har nu:

StringBuilder sb = new StringBuilder("Insert Into reseller_contacts (");
foreach(Control Ctrl in this.Controls)
{
	if(Ctrl is System.Web.UI.HtmlControls.HtmlInputText)
	{
		sb.Append(Ctrl.ToString());
		sb.Append(",");
	}
}
sb.Remove(sb.Length -1,1);
sb.Append(") VALUES (");
			
foreach(Control Ctrl in this.Controls)
{
	if(Ctrl is System.Web.UI.HtmlControls.HtmlInputText)
	{
		sb.Append("'");
		sb.Append(Ctrl.ToString());
		sb.Append("',");
	}
}
sb.Remove(sb.Length - 1, 1);
sb.Append(")");

Response.Write (sb.ToString());

sb.ToString() har jag satt tillfälligt eftersom inte Name kan hittas
Det här får jag ut:

Insert Into reseller_contacts ) VALUES )

någon som har ett tips?

Medlem sedan jan. 20013 341 inlägg
#7

Mitt problem är att alla textfält ligger i en table som är en server kontroll, som i sin tur ligger i en panel:
EX:

<asp:panel id="Step3" runat="server" Visible="True">
<TABLE id="contact" cellSpacing="0" cellPadding="0" border="0" runat="server">
<TR>
<TD><INPUT class="input400" id="c_company" type="text" maxLength="150" name="c_company" runat="server"></TD>
</TR>
</TABLE>
</asp:panel>

Kör jag den här koden:

foreach(Control ctrl in Step3.Controls)
{
	Response.Write(ctrl.ID + " " + ctrl.GetType().ToString() + "<br>");
}

så får jag ut:

System.Web.UI.LiteralControl
contact System.Web.UI.HtmlControls.HtmlTable

Om jag lägger inputen utanför tabellen så får jag upp den i listan, men det är tyvärr inget alternativ eftersom tabellen visas beroende på andra inställningar!

Byter jag ut "Step3.Controls" till "contact.Controls" så får jag ut

System.Web.UI.HtmlControls.HtmlTableRow

Hur löser jag det här?

Medlem sedan sep. 20011 914 inlägg
#8

Här får jag fram alla textboxars värde:

<asp:Button ID="btGrr" OnClick="btGrr_Click" Text="Ta fram" Runat="server"/>
<asp:Panel ID="pnlGrr" Runat="server">
   <table>
      <tr>
         <td>
            <asp:TextBox ID="tb1" Runat="server"/>
         </td>
      </tr>
      <tr>
         <td>
            <asp:TextBox ID="tb2" Runat="server"/>
         </td>
      </tr>
      <tr>
         <td>
            <asp:TextBox ID="tb3" Runat="server"/>
         </td>
      </tr>
   </table>
</asp:Panel>
public void btGrr_Click(object sender, System.EventArgs e)
{
   foreach(Control grr in pnlGrr.Controls)
   {
      if(grr.ToString() == "System.Web.UI.WebControls.TextBox")
      {
         Response.Write(((TextBox)grr).Text + "<br/>");
      }
   }
}
Medlem sedan jan. 20013 341 inlägg
#9

Jo, men prova göra <table> till <table id="contact" cellSpacing="0" cellPadding="0" border="0" runat="server">

Medlem sedan sep. 20011 914 inlägg
#10

Här får jag nu fram textboxarnas värde från koden i mitt förra inlägg.

public void btGrr_Click(object sender, System.EventArgs e)
{
   foreach(Control grr in pnlGrr.Controls)
   {
      if(grr.ToString() == "System.Web.UI.HtmlControls.HtmlTable")
      {
         for (int i=0; i<=tblHmm.Rows.Count - 1; i++)
         {
            Response.Write("<li>" + ((TextBox)tblHmm.Rows[i].FindControl("tb" + (i + 1))).Text );
         }
      }
   }
}

Fråga. Varför har du runat="server" på tabellen?

Medlem sedan jan. 20013 341 inlägg
#11

Fick det här svaret på ett annat forum:
HtmlControllerna är "Children" till tabellen och den här koden ska fungera, har dock inte testat den än:

foreach(Control ctrTopLvl in Step3.Controls) 
{ 
     Response.Write(ctrTopLvl.ID + " " + ctrTopLvl.GetType().ToString() + "<br>"); 
     foreach(Control ctrSecondLvl in ctrTopLvl.Controls) 
     { 
          Response.Write("     " + ctrSecondLvl.ID + " " + ctrSecondLvl.GetType().ToString() + "<br>"); 
     }
}
Medlem sedan juni 20001 257 inlägg
#12

aleborg skrev:

Fick det här svaret på ett annat forum:
HtmlControllerna är "Children" till tabellen och den här koden ska fungera, har dock inte testat den än:

foreach(Control ctrTopLvl in Step3.Controls) 
{ 
     Response.Write(ctrTopLvl.ID + " " + ctrTopLvl.GetType().ToString() + "<br>"); 
     foreach(Control ctrSecondLvl in ctrTopLvl.Controls) 
     { 
          Response.Write("     " + ctrSecondLvl.ID + " " + ctrSecondLvl.GetType().ToString() + "<br>"); 
     }
}

Nja, eftersom varje ctrSecondLvl också kan ha noll eller flera Controller så skall man loopa rekursivt, och inte så som du har gjort.

258 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)